perm filename DFTP.MAC[NET,MRC]2 blob sn#237778 filedate 1976-09-22 generic text, type T, neo UTF8
	TITLE	DFTP  Datacomputer File Transfer Program

IFNDEF F.TENX,F.TENX==0		; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX

IFNDEF F.PCAP,F.PCAP==-1	; PRIVILEGED CAPABILITIES RESTRICTED

IFNDEF F.SAIL,F.SAIL==-1	; -1 IF FOR SAIL

; ***DEFINITIONS***

	DCHOST==37
	DCSOKT==303

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000
	SIZFIL==↑D5000

	LBUFS==100
	SBUFS==20

IFL F.TENX,DEFINE THUD<.LOSE 1000>
IFE F.TENX,DEFINE THUD<HALT .-1>
IFG F.TENX,THUD==-1

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	REG1==1
	REG2==2
	REG3==3
	REG4==4

;	(COMMONLY USED REGISTERS)
	IOREG==R5
	BPREG==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

; MACRO DEFINITIONS

	SALL

IFL F.TENX,DEFINE RELOC(ADDR)<LOC ADDR>



DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>

DEFINE	TAIN(MSG)
<	HRRZI	REG1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>
DEFINE	TCIL(ARG)
<	..CMCH==0
	..CMWD==0
	..CNUM==0
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..CNUM==..CNUM+1
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
		..FLAG==<-..FLAG>>
	IFL ..FLAG,<!!
		PRINTX BAD ARGUMENTS TO TCIN>
	..CMWD==<<<..CMCH-1>/5>+1>
	..LOC1==.
	..LOC2==..LOC1+4
	..LOC3==..LOC2+..CNUM
	RELOC ..LOC3
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
			ASCII	/ARG/
			IFG ..IDX,<REPEAT ..IDX, <0>>
			..LOC3==.>
		IFL ..FLAG,<
			RELOC ..LOC2
			ARG
			..LOC2==.
			RELOC ..LOC3>
		..FLAG==<-..FLAG>>
	RELOC ..LOC1
	..LOC2
	..CNUM
	..CMCH
	..CMWD
	RELOC ..LOC3>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IOREG,[BUFFER,,5*BUFS]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IOREG,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IOREG,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <REG1-REG>,< MOVE	REG1,REG>
	IFB <RADIX>,< HRRZI	REG2,↑D10>
	IFNB <RADIX>,< HRRZI	REG2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <REG1-REG>,< MOVE	REG1,REG>
	IFB <RADIX>,< HRROI	REG2,↑D10>
	IFNB <RADIX>,< HRROI	REG2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	IOREG,STRING>
	IFNB <FLAGS>,<
		HRRI	IOREG,STRING
		HRLI	IOREG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	ILDB	0,SOURCE
	JUMPE	0,.+3
	IDPB	0,DESTIN
	JRST	.-3
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE>

; SYSTEM DEPENDENT DEFINITIONS

; ((ITS))
IFL F.TENX,<
	SEARCH SITS
	LOC 150

;  Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO.  First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).

INIT:	MOVSI (JUMPA)
	HRR .JBSA##
	.BREAK 12,[400001,,]		;set start address
	SETZ 1,
	MOVE [1,,2]
	BLT 150
	.BREAK 16,100000		;return to DDT
	JRST DFTP

; I/O Channels

	TTI==1		; TTY I/O
	TTO==2
	DCI==3		; Datalanguage I/O
	DCO==4
	ICP==5		; ICP channel
	DDI==6		; Data I/O
	DDO==7
	LCI==10		; Local input
	LCO==11		; Local output
 
; ITS network definitions

%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11

DEFINE	TBIN(REG)
<	.IOT TTI,REG
	CAIG REG,"z"
	 CAIGE REG,"a"
	  CAIA
	   TRZ REG," ">

TBOUT==<.IOT TTO,>

DEFINE	TSOUT(STRING)
<	IRP STRING
<	PUSH STAK,R1
	MOVEI R1,STRING
	PUSHJ STAK,$STRIN
	POP STAK,R1
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$STRIN:	PUSH STAK,			; save AC 0
	HRLI R1,(POINT 7,)		; build a byte pointer to string
$STRI1:	ILDB R1				; get a character from string
	JUMPE $STRI2			; quit when done
	.IOT TTO,			; output the character
	JRST $STRI1			; and loop for more
$STRI2:	POP STAK,			; restore AC 0
	POPJ STAK,			; and return

DEFINE DCBIN(REG)
<	.IOT DCI,REG
	SKIPE FLAGDD
	 .IOT TTO,REG
>

DCBOUT==<.IOT DCO,>

DEFINE	DCSOUT(STRING)
<	IRP STRING
<	PUSH STAK,R1
	MOVEI R1,STRING
	PUSHJ STAK,$DSTRI
	POP STAK,R1
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$DSTRI:	PUSH STAK,			; save AC 0
	HRLI R1,(POINT 7,)		; build a byte pointer to string
$DSTR1:	ILDB R1				; get a character from string
	JUMPE $DSTR2			; quit when done
	.IOT DCO,			; output the character
	SKIPE FLAGDD			; show DATALANGUAGE?
	 .IOT TTO,
	JRST $DSTR1			; and loop for more
$DSTR2:	POP STAK,			; restore AC 0
	POPJ STAK,			; and return
>

; (((TOPS-10)))
IFE F.TENX,<
	TWOSEG
	RELOC	400000

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBIN(REG)
<	TTCALL	0,REG
	CAILE	REG,"Z"+40
	 JRST	.+3
	CAIL	REG,"A"+40
	 SUBI	REG,40>
DEFINE	TBOUT(REG)
<	TTCALL	1,REG>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1>
DEFINE	DCBOUT(REG)
<	IDPB	REG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI	REG1,STRING
	CALLR	NUTMO>
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZ	REG1,DCOBUF
	CALLR	NUTDD
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
	SEARCH	STENEX

DEFINE	TBIN(REG)
<	PBIN
	CAILE	REG1,"Z"+40
	 JRST	.+3
	CAIL	REG1,"A"+40
	 SUBI	REG1,40
	IFN	<REG1-REG>,< HRRZI	REG,(REG1)>>
DEFINE	TBOUT(REG)
<	IFN	<REG1-REG>,< HRRZI	REG1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	REG1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	REG1,(REG2)
	PBOUT
	HRRZI	REG,(REG2)>
DEFINE	DCBOUT(REG)
<	MOVE	REG1,DCOJFN
	HRRZI	REG2,(REG)
	BOUT
	MOVEI	REG2,21
	MTOPR>
DEFINE	DCSOUT(STRING)
<	..IDX==1
	IRP STRING<..IDX==..IDX+2>
	SKIPN	FLAGDD
	 JRST	.+..IDX
	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>
	MOVE	REG1,DCOJFN
	SETZ	REG3,
	IRP STRING
<	HRROI	REG2,STRING
	SOUT>
	MOVEI	REG2,21
	MTOPR>
>
; (((↑↑↑)))

; ***PROGRAM***

DFTP:
IFE F.TENX,JFCL				;CCL ENTRY POINT
IFGE F.TENX,RESET
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	CALLR	D$INIT

; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
	MOVEI	UTIL,CMDM2
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
;	(((ITS)
	IFL F.TENX,<
		MOVEI UTIL,CMDM2
		.SUSET [.RXUNAME,,REG1]
		.CALL [	SETZ
			SIXBIT/OPEN/
			MOVEI
			[('DSK')]
			['.FILE.']
			['(DIR) ']
			SETZ REG1]
		 MOVEI UTIL,CMDM1		; NO ITS DIRECTORY
>
;	(((↑↑↑)))
;	(((TOPS-10)))
	IFE F.TENX,<
		MOVEI	UTIL,CMDM1
;		(!DISABLE!)
>
;	(((↑↑↑)))
;	(((TENEX)))
	IFG F.TENX,<
		MOVEI	UTIL,CMDM1
		MOVEI	REG1,400000	; FOR THIS FORK
		RPCAP
		TRNE	REG2,600000	; (1B18+1B19) WHEEL OR OPER
		 MOVEI	UTIL,CMDM2
>
;	(((↑↑↑)))
>
; (((↑↑↑)))
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD
CMDNEW:	TSOUT	<CRLF>
CMDCMD:	JRST	@CMDMOD
CMDM1:	TSOUT	<[ASCIZ /*/]>
	TCIN	(CMDMC1,[ASCIZ /*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM2:	TSOUT	<[ASCIZ /*/]>
	TCIN	(CMDMC2,[ASCIZ /*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM3:	TSOUT	<[ASCIZ /!/]>
	TCIN	(CMDMC3,[ASCIZ /!/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)

; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))

CALO:	PATH	([ASCIZ / ALLOCATE /],PATHCC)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ / [Megabits:/]>
	TNIN	([ASCIZ / [Megabits:/])
	 JRST	CMDCMD
	MOVEM	IOREG,ABUF
	JUMPN	IOREG,CALO0
	MOVEI	IOREG,"0"
	TBOUT	<IOREG>
CALO0:	TSOUT	<[ASCIZ /]/],CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ / ATTACH /],PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ / CHANGE /],PATHCC)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ / CONNECT /],PATHCA!PATHN2)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCOP:	PATH	([ASCIZ / COPY /],PATHCC!PATHRR!PATHSS!PATHPP!PATHPO)
	 JRST	CMDCMD
	CALLR	DCOP
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ / CREATE /],PATHCC)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ / DELETE /],PATHCC!PATHSS!PATHST!PATHPP!PATHAC)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ / DIRECTORY /],PATHCC!PATHN1!PATHSS!PATHST)
	 JRST	CMDCMD
	MOVE	IOREG,CMDMOD
	CAIN	IOREG,CMDM3
	 JRST	CDIR0
	TSOUT	<[ASCIZ /**/]>
	TCIN	(CDIRC1,[ASCIZ /**/])
	 JRST	CMDCMD
	 JRST	CDIR1
	JRST	CDIR2
CDIR0:	TSOUT	<[ASCIZ /!!/]>
	TCIN	(CDIRC2,[ASCIZ /!!/])
	 JRST	CMDCMD
	 JRST	CDIR1
	JRST	CDIR2
CDIR1:	TSOUT	<[ASCIZ /TERSE/]>
	MOVEI	FLAG,DD$T
CDIR2:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD
CDIRC1:	TCIL	<CREATION,DD$C,TERSE,DD$T,VERBOSE,DD$V>
CDIRC2:	TCIL	<CREATION,DD$C,PROTECTION,DD$P,TERSE,DD$T,VERBOSE,DD$V>

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

; (((TENEX)))
IFG F.TENX,<
CEXE:	MOVEI	REG1,37
	PBOUT
	HRRZI	REG1,-1
	RFMOD
	MOVE	R10,REG2
	RFCOC
	MOVE	R11,REG2
	MOVE	R12,REG3
	HRLZI	REG1,(1B1)	; INFERIOR GETS THIS FORK'S CAPABILITIES
	CFORK			; CREATE FORK
	 THUD
	MOVE	UTIL,REG1
	HRLZI	REG1,(1B2+1B17)
	HRROI	REG2,[ASCIZ /<SYSTEM>EXEC.SAV/]
	GTJFN
	 THUD
	HRLI	REG1,(UTIL)
	GET			; LOAD EXEC INTO FORK
	MOVE	REG1,UTIL
	SETZ	REG2,
	SFRKV			; START FORK AT MAIN STARTUP
	WFORK
	KFORK
	HRRZI	REG1,-1
	MOVE	REG2,R10
	SFMOD
	MOVE	REG2,R11
	MOVE	REG3,R12
	SFCOC
	JRST	CMDCMD
>
; (((↑↑↑)))

CGET:	PATH	([ASCIZ / GET /],PATHCC!PATHRL!PATHSS!PATHPO)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

; (((TOPS-10)))
IFE F.TENX,<
CLOD:	TTCALL	3,CRLF
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	MOVEI	REG1," "
	TTCALL	1,REG1
	TTCALL	3,ABUF
	TTCALL	3,CRLF
	JRST	CLOD1
>
; (((↑↑↑)))

CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ / PUT /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TSOUT	<CRLF>
	JRST	QUIT

CRET:	PATH	([ASCIZ / RETRIEVE /],PATHCC!PATHRL!PATHSS!PATHPO)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ / STORE /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW

CVER:	PATH	([ASCIZ / VERIFY /],PATHCC!PATHLR!PATHSS!PATHPO)
	 JRST	CMDCMD
	CALLR	DVER
	 JRST	CMDCMD
	JRST	CMDCMD

; ***PATH INPUT AND TRANSLATION***

; FLAG DEFINITIONS
	PATHCT==400000		; TOP CONTEXT DEFAULT
	PATHCA==200000		; ATTACH CONTEXT DEFAULT
	PATHCC==100000		; CONNECT CONTEXT DEFAULT
	PATHRR==040000		; REMOTE [TO] REMOTE
	PATHLR==020000		; LOCAL [AS] REMOTE
	PATHRL==010000		; REMOTE [AS] LOCAL
	PATHSS==004000		; SETS -- ALLOWED
	PATHST==002000		; SETS -- TRAILING DEFAULT
	PATHN1==000400		; NULL DEFAULT ONE
	PATHN2==000200		; NULL DEFAULT TWO
	PATHPO==000040		; SECONDARY PATH -- OPEN
	PATHPP==000020		; SECONDARY PATH -- PARENT
	PATHAC==000001		; ACKNOWLEDGE-CONFIRM

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	IOREG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<UTIL,FLAG>
	MOVE	FLAG,IOREG
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	TLNN	FLAG,PATHN1!PATHN2
	 JRST	P$1I
	CAIN	TCIO,12
	 JRST	P$1N
	CAIN	TCIO,37
	 JRST	P$1N
P$1I:	MOVE	IOREG,[GBUF1,,5*LBUFS]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	JUMPN	UTIL,P$1T
P$1N:	TLNN	FLAG,PATHN1
	 JRST	P$1N3
	CAIN	IOREG,33
	 JRST	P$1N2
P$1N1:	MOVE	REG1,[ASCII /**/]
	MOVEM	REG1,GBUF1
	TSOUT	<[ASCIZ /[Nodes]/]>
	JRST	P$1E
P$1N2:	MOVE	REG1,[ASCII /</]
	MOVEM	REG1,GBUF1
	TSOUT	<[ASCIZ /[Connected Node]/]>
	JRST	P$1E
P$1N3:	MOVE	REG1,[ASCII /<</]
	MOVEM	REG1,GBUF1
	TSOUT	<[ASCIZ /[Attached Node]/]>
	JRST	P$1E
P$1T:	TLNN	FLAG,PATHST
	 JRST	P$1E
	CAIN	IOREG,33
	 JRST	P$1T1
	CAIN	IOREG," "
	 JRST	P$1T1
	JRST	P$1E
P$1T1:	MOVE	REG1,[440700,,GBUF1]
	ILDB	REG2,REG1
	CAIE	REG2,"<"
	 JRST	P$1T3
	ILDB	REG2,REG1
	JUMPE	REG2,P$1T2
	CAIE	REG2,"<"
	 JRST	P$1T3
	ILDB	REG2,REG1
	JUMPE	REG2,P$1T2
	CAIE	REG2,"<"
	 JRST	P$1T3
	ILDB	REG2,REG1
	JUMPN	REG2,P$1T3
P$1T2:	MOVEI	REG3,"*"
	DPB	REG3,REG1
	IDPB	REG3,REG1
	IDPB	REG2,REG1
	TSOUT	([ASCIZ /[Nodes]/])
	JRST	P$1E
P$1T3:	ILDB	REG2,REG1
	JUMPN	REG2,P$1T3
	MOVEI	REG3,">"
	DPB	REG3,REG1
	MOVEI	REG3,"*"
	IDPB	REG3,REG1
	IDPB	REG3,REG1
	IDPB	REG2,REG1
	TSOUT	([ASCIZ />[Nodes]/])
P$1E:	TLNE	FLAG,PATHLR!PATHRL!PATHRR
	 JRST	P$2
	TLNN	FLAG,PATHAC
	 JRST	P$1E1
	TAIN	<[ASCIZ / [Confirm]/]>
	 RETURN
	 RETURN
	JRST	P$1E2
P$1E1:	TSOUT	<CRLF>
P$1E2:	TLNN	FLAG,PATHPP
	 JRST	P$1E3
	MOVE	IOREG,[GBUF1,,PBUF]
	HRRZI	UTIL,GBUF2
	CALLR	P$CS
	RETURN	SKIP,1
P$1E3:	MOVE	IOREG,[GBUF1,,PBUF]
	CALLR	P$CP
	RETURN	SKIP,1
P$2:	TLNE	FLAG,PATHRR
	 JRST	P$2C
; (((TENEX)))
IFG F.TENX,<
	SKIPN	LFILE
	 JRST	.+5
	TLNN	FLAG,PATHRL
	 JRST	.+3
	CALLR	P$LF
	JRST	P$2MP
>
; (((↑↑↑)))
	CAIN	IOREG,33
	 JRST	P$2M
	CAIN	IOREG," "
	 JRST	P$2M
	CALLR	P$LF
	JRST	P$2MP
P$2C:	TSOUT	<[ASCIZ / [To] /]>
	MOVE	IOREG,[UBUF1,,5*LBUFS]
	MOVE	UTIL,[GBUF1,,[ASCIZ / [To] /]]
	CALLR	P$IN
	 RETURN
	TSOUT	<CRLF>
	MOVE	IOREG,[GBUF1,,GBUF2]
	CALLR	P$CP
	MOVE	IOREG,[UBUF1,,GBUF1]
	HRRZI	UTIL,PBUF
	CALLR	P$CS
	MOVE	IOREG,[GBUF2,,UBUF2]
	CALLR	P$ON
	MOVE	IOREG,[GBUF1,,UBUF1]
	CALLR	P$ON
	RETURN	SKIP,1
P$2M:	TSOUT	<[ASCIZ / [As] /]>
	TLNN	FLAG,PATHLR
	 JRST	P$2ML
	MOVE	REG1,[GBUF1,,ABUF]
	BLT	REG1,<ABUF+SBUFS-1>
	MOVE	IOREG,[GBUF1,,5*LBUFS]
	MOVE	UTIL,[ABUF,,[ASCIZ / [As] /]]
	CALLR	P$IN
	 RETURN
	JRST	P$2MP
P$2ML:	MOVE	IOREG,[ABUF,,5*SBUFS]
	MOVE	UTIL,[GBUF1,,[ASCIZ / [As] /]]
	CALLR	P$IN
	 RETURN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
P$2MP:	TSOUT	<CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
P$2MP:	SKIPE	LJFN
	 JRST	.+3
	MOVEI	REG1,37
	PBOUT
>
; (((↑↑↑)))
	CALLR	P$LN
	TLNN	FLAG,PATHPP
	 JRST	P$2M1
	MOVE	IOREG,[GBUF1,,PBUF]
	HRRZI	UTIL,GBUF2
	CALLR	P$CS
	JRST	P$2M2
P$2M1:	MOVE	IOREG,[GBUF1,,PBUF]
	CALLR	P$CP
P$2M2:	MOVE	IOREG,[PBUF,,ABUF]
	CALLR	P$ON
	ENDR	SKIP,1

; PATH INPUT
;   IN: IOREG -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IOREG -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$GE==100000		; GROUP ENCOUNTERED (*)
	P$I$PW==040000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$FN==000400		; FILE NAME
;
P$IN:	BEGINR	<BPREG,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IOREG
	MOVE	R12,UTIL
	HLR	BPREG,IOREG
	HRLI	BPREG,440700
	SETZ	UTIL,
P$ICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	P$IREP
	CAIN	IOREG,"A"-100
	 JRST	P$IDEL
	CAIN	IOREG,"X"-100
	 JRST	P$IENR
	CAIN	IOREG,177
	 JRST	P$IENR
	CAIN	IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST P$ICHR
	CAIN	IOREG,12
	 JRST	P$IEND
	CAIN	IOREG,33
	 JRST	P$IEND
	CAIN	IOREG,37
	 JRST	P$IEND
	CAIGE	IOREG," "
	 JRST	P$IBAD
	CAIN	IOREG,42
	 JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IOREG," "
	 JRST	P$IEND
IFGE F.TENX,<			; have to use ' for passwords
	CAIN	IOREG,":"
	 JRST	P$IPON
>
	CAIN	IOREG,"'"
	 JRST	P$IPON
	CAIN	IOREG,"?"
	 JRST	P$IBAD
	CAIN	IOREG,"<"
	 JRST	P$ISA
	CAIN	IOREG,">"
	 JRST	P$ISD1
	CAIN	IOREG,"."
	 JRST	P$ISD2
	CAIN	IOREG,"*"
	 JRST	P$ISG
	TRNE	R10,P$I$GE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IOREG,">"
	 JRST	P$IPOF
	CAIN	IOREG,"'"
	 JRST	P$IBAD
	IDPB	IOREG,BPREG
	AOJA	UTIL,P$ICHR
P$ISA:	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$FN
	 JRST	P$IBAD
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	TROE	R10,P$I$DE
	 JRST	P$IBAD
	TRZ	R10,P$I$GE
	JRST	P$ICHE
P$ISD2:	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	TROE	R10,P$I$DE!P$I$FN
	 JRST	P$IBAD
	TRZ	R10,P$I$GE
	JRST	P$ICHE
P$ISG:	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$GE
	JRST	P$ICHE
P$IPON:	TRNE	R10,P$I$AE!P$I$DE!P$I$GE
	 JRST	P$IBAD
	MOVEI	REG1,1(UTIL)
	CAIL	REG1,(R11)
	 JRST	P$IBAD
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	MOVEI	REG1,"P"-100
	IDPB	REG1,BPREG
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	MOVEI	REG1,1(UTIL)
	CAIL	REG1,(R11)
	 JRST	P$IBAD
	MOVEI	REG1,"P"-100
	IDPB	REG1,BPREG
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IOREG,R13
	JUMPE	IOREG,P$IR03
	CAIN	IOREG,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IOREG>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IOREG,(BPREG)
	HLR	R13,R11
	CAIGE	IOREG,(R13)
	 JRST	P$ICHR
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BPREG
	 JRST	P$ICHR
	ILDB	IOREG,R13
	CAIN	IOREG,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IOREG>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	CAIN	IOREG,"P"-100
	 JRST	P$ID01
	LDB	REG1,BPREG
	CAIN	REG1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IOREG>
	TRZ	R10,P$I$AE!P$I$DE!P$I$GE
	CAIN	IOREG,"."
	 TRZ	R10,P$I$FN
	CAIE	IOREG,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SUBI	UTIL,1
	JUMPE	UTIL,P$ICHR
	LDB	REG1,BPREG
	CAIN	REG1,"<"
	 TRO	R10,P$I$AE
	CAIN	REG1,">"
	 TRO	R10,P$I$DE
	CAIN	REG1,"."
	 TRO	R10,P$I$DE
	CAIN	REG1,"*"
	 TRO	R10,P$I$GE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IOREG,BPREG
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
P$ID03:	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	TBOUT	<IOREG>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETO	IOREG,
	SETZ	UTIL,
	RETURN
P$IEND:	TRNE	R10,P$I$DE
	 JRST	P$IBAD
; (((ITS)))
IFL F.TENX,<
	CAIE IOREG," "
	 JRST P$IENN
	TLNN FLAG,PATHLR!PATHRL
	 JRST P$IENN
	JUMPN R12,[	TLNE FLAG,PATHRL
			 JRST P$ICHE	; GET -- second argument
			JRST P$IENN]
	TLNE FLAG,PATHLR
	 JRST P$ICHE		; PUT -- first argument
	JRST P$IENN
P$IENN:
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	TLNN	FLAG,PATHLR!PATHRL
	 JRST	P$IENN
	JUMPN	UTIL,P$IENN
	CAIG	R12,-1
	 JRST	.+3
	TLNE	FLAG,PATHLR
	 JRST	P$IBAD		; PUT -- SECOND ARGUMENT
	MOVEI	REG1,76
	PBOUT
	TLNE	FLAG,PATHLR
	 HRLZI	REG1,160003	; OLD,MSG,CONFIRM,JFN,SHORT
	TLNE	FLAG,PATHRL
	 HRLZI	REG1,660003	; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
	MOVE	REG2,[100,,101]
	GTJFN
	 JRST	P$IENR
	MOVEM	REG1,LJFN
	HRROI	REG1,LFILE
	MOVE	REG2,LJFN
	SETZ	REG3,
	JFNS
	MOVEI	REG1,100
	BKJFN
	 THUD
	PBIN
	MOVEI	IOREG,(REG1)
	CAILE	R12,-1
	 JRST	P$IENE		; GET -- SECOND ARGUMENT
	HLRO	REG1,R11
	MOVE	REG2,LJFN
	MOVE	REG3,[1B8+1B11+1B35] ; NAME,EXT,PUNCTUATION
	TLNN	FLAG,PATHLR
	 JRST	.+5
	CAIN	IOREG,33
	 SETZ	REG3,
	CAIN	IOREG," "
	 SETZ	REG3,
	JFNS			; FIRST ARGUMENTS
	JUMPE	REG3,P$IENE
	LDB	REG2,REG1
	CAIE	REG2,"."
	 JRST	P$IENE
	SETZ	REG2,
	DPB	REG2,REG1
P$IENE:	MOVE	REG1,LJFN
	RLJFN
	 THUD
	MOVEI	UTIL,-1(R11)
	SETZM	LJFN
	CAIN	IOREG,12
	 SETOM	LJFN
	CAIN	IOREG,37
	 SETOM	LJFN
	RETURN	SKIP,1
P$IENN:	SETZM	LFILE
	SETZM	LJFN
>
; (((↑↑↑)))
	TLNN	FLAG,PATHN1!PATHN2
	 JUMPE	UTIL,P$IBAD
	SETZ	R13,
	IDPB	R13,BPREG
	ENDR	SKIP,1

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IOREG -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IOREG,FLAG>
	MOVEI	REG1,<<LBUFS*5>-1>
	HLR	REG2,IOREG
	HRLI	REG2,350700
	HRRI	REG3,(IOREG)
	HRLI	REG3,440700
	LDB	IOREG,REG2
	CAIN	IOREG,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IOREG,REG2
	CAIE	IOREG,"<"
	 JRST	P$CPCC
	ILDB	IOREG,REG2
	CAIE	IOREG,"<"
	 JRST	P$CPCA
	ILDB	IOREG,REG2
P$CPCT:	MOVE	REG4,[440700,,[ASCIZ /%TOP./]]
	SCOPY	(REG4,REG3)
	MOVE	REG4,[440700,,ANCHOR]
	SCOPY	(REG4,REG3)
	SUBI	REG1,11
	JRST	P$CPCE
P$CPCA:	MOVE	REG4,[440700,,[ASCIZ /%LOGIN/]]
	SCOPY	(REG4,REG3)
	SUBI	REG1,6
	JRST	P$CPCE
P$CPCC:	MOVE	REG4,[440700,,CONTEX]
	ILDB	0,REG4
	JUMPE	0,.+4
	SOJL	REG1,P$CPE
	IDPB	0,REG3
	JRST	.-4
	MOVE	REG4,REG3
	IDPB	0,REG4
P$CPCE:	JUMPE	IOREG,P$CPZ0
	MOVEI	REG4,"."
	IDPB	REG4,REG3
	SUBI	REG1,1
	MOVEI	REG4,42
	SETZ	FLAG,
	JRST	P$CPI0
P$CPI:	ILDB	IOREG,REG2
P$CPI0:	CAIN	IOREG,"P"-100
	 JRST	P$CPI
	CAIN	IOREG,">"
	 JRST	P$CPS
	CAIN	IOREG,"."
	 JRST	P$CPS
	JUMPE	IOREG,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IOREG,":"
	 JRST	P$CPP
	CAIN	IOREG,"'"
	 JRST	P$CPP
	CAIN	IOREG,"*"
	 JRST	P$CPO
	CAIGE	IOREG,"A"
	 JRST	P$CPQ
	CAILE	IOREG,"Z"
	 JRST	P$CPQ
P$CPO:	SOJL	REG1,P$CPE
	IDPB	IOREG,REG3
	JRST	P$CPI
P$CPQ:	SOJL	REG1,P$CPE
	IDPB	REG4,REG3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IOREG,"'"
	IDPB	IOREG,REG3
	MOVEI	IOREG,")"
	IDPB	IOREG,R3
	SETZ	FLAG,
	MOVEI	IOREG,"."
	JRST	P$CPO
P$CPP:	SUBI	REG1,4
	JUMPL	REG1,P$CPE
	MOVEI	IOREG,"("
	IDPB	IOREG,R3
	MOVEI	IOREG,"'"
	IDPB	IOREG,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ / (Pathname too long.)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,.+5
	MOVEI	REG1,"'"
	IDPB	REG1,REG3
	MOVEI	REG1,")"
	IDPB	REG1,REG3
P$CPZ0:	IDPB	IOREG,REG3
	ENDR

; CONVERT PATH -- SUPERIOR (IF ANY) AND COMPLETE PATH
;   IN: IOREG -- SOURCE,,DESTINATION
;	UTIL -- DESTINATION OF SUPERIOR PATH
;
P$CS:	BEGINR	<BPREG,UTIL>
	HLR	REG1,IOREG
	HRLI	REG1,440700
	MOVE	REG2,REG1
	SETZM	(UTIL)
P$CS1:	ILDB	REG3,REG2
	JUMPE	REG3,P$CS2
	CAIN	REG3,">"
	 MOVE	REG1,REG2
	CAIN	REG3,"<"
	 MOVE	REG1,REG2
	JRST	P$CS1
P$CS2:	ILDB	REG2,REG1
	JUMPE	REG2,P$CS3
	CAIE	REG2,"."
	 JRST	P$CS2
	MOVE	BPREG,REG1
	SETZ	REG1,
	DPB	REG1,BPREG
	HRLI	UTIL,(IOREG)
	HRRI	IOREG,(UTIL)
	CALLR	P$CP
	HLR	IOREG,UTIL
	MOVEI	REG1,">"
	DPB	REG1,BPREG
P$CS3:	CALLR	P$CP
	ENDR

; DATACOMPUTER OPEN NODE NAME
;   IN: IOREG -- SOURCE,,DESTINATION
;
P$ON:	BEGINR
	HLR	REG1,IOREG
	HRLI	REG1,440700
	MOVE	REG2,REG1
P$ONI:	ILDB	REG3,REG2
	JUMPE	REG3,P$ONM
	CAIN	REG3,"."
	 MOVE	REG1,REG2
	CAIN	REG3,42
	 IBP	REG2
	JRST	P$ONI
P$ONM:	HRRI	REG2,(IOREG)
	HRLI	REG2,440700
P$ONM1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,P$ONM1
	ENDR

; LOCAL FILE NAME FIND
;
P$LF:	BEGINR
	MOVE	REG1,[440700,,GBUF1]
	MOVE	REG2,[440700,,GBUF1]
P$LFI:	ILDB	REG3,REG2
	JUMPE	REG3,P$LFM
	CAIN	REG3,">"
	 MOVE	REG1,REG2
	CAIN	REG3,"<"
	 MOVE	REG1,REG2
	JRST	P$LFI
P$LFM:	MOVE	REG2,[440700,,ABUF]
P$LFM1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,P$LFM1
	ENDR

; LOCAL FILE NAME PREPARATION
;
P$LN:	BEGINR	<IOREG>
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	HRRZI	IOREG,ABUF
	CALLR	LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LFILE
	 RETURN
	MOVE	IOREG,[ABUF,,LFILE]
	BLT	IOREG,<LFILE+SBUFS-1>
>
; (((↑↑↑)))
	ENDR

; ***DATACOMPUTER INTERFACE ROUTINES***

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IOREG,BPREG,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$IN0
	TSOUT	<[ASCIZ / ?? DATACOMPUTER initialization failure ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ / [Attaching]/],CRLF>
	HRRZI	UTIL,HOSTS
D$IN1:	SKIPN	(UTIL)
	 JRST	D$IND
	HLRZ	REG1,(UTIL)
	CAME	REG1,LHOST
	 AOJA	UTIL,D$IN1
	MOVE	IOREG,[440700,,[ASCIZ /%TOP.DFTP./]]
	MOVE	BPREG,[440700,,ABUF]
	SCOPY	(IOREG,BPREG)
	HRR	IOREG,(UTIL)
	HRLI	IOREG,440700
	SCOPY	(IOREG,BPREG)
	MOVEI	IOREG,"."
	IDPB	IOREG,BPREG
; (((ITS)))
IFLE F.TENX,<
	.SUSET [.RXUNAME,,UBUF1]
	SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
IFE F.SAIL,<
	MOVE	REG1,[-1,,31]
	MOVE	REG2,[-1,,32]
	GETTAB	REG1,
	 THUD
	GETTAB	REG2,
	 THUD
	MOVEM	REG1,UBUF1
	MOVEM	REG2,<UBUF1+1>
>
IFN F.SAIL,<
	GETPPN REG1,
	 JFCL
	MOVEM REG1,UBUF1
	SETZM UBUF1+1
>
>
; (((↑↑↑)))
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	SETZM	<UBUF1+2>
	MOVE	REG1,[440600,,UBUF1]
	MOVEI	REG2,42
	ILDB	REG3,REG1
	JUMPE	REG3,.+7
	ADDI	REG3,40
	CAIL	REG3,"A"
	 CAILE	REG3,"Z"
	  IDPB	REG2,BPREG
	IDPB	REG3,BPREG
	JRST	.-7
	MOVE	REG1,BPREG
	IDPB	REG3,REG1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAMN	REG1,REG2
	 JRST	.+10
	HRROI	REG1,[ASCIZ /  (from /]
	PSOUT
	MOVEI	REG1,101
	DIRST
	 THUD
	HRROI	REG1,[ASCIZ /)
/]
	PSOUT
	HRROI	REG1,UBUF1
	DIRST
	 THUD
	MOVE	REG1,[440700,,UBUF1]
	MOVEI	REG2,42
	ILDB	REG3,REG1
	JUMPE	REG3,.+6
	CAIL	REG3,"A"
	 CAILE	REG3,"Z"
	  IDPB	REG2,BPREG
	IDPB	REG3,BPREG
	JRST	.-6
	MOVE	REG1,BPREG
	IDPB	REG3,REG1
>
; (((↑↑↑)))
	DCSOUT	<[ASCIZ /LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	DCSOUT	<[ASCIZ /LIST /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ /  [Password:/]>
	TSIN	(UBUF1,LBUFS,<[ASCIZ /  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ /]/],CRLF>
	MOVE	REG2,BPREG
	MOVEI	REG1,"("
	IDPB	REG1,REG2
	MOVEI	REG1,"'"
	IDPB	REG1,REG2
	MOVE	REG1,[440700,,UBUF1]
	SCOPY	(REG1,REG2)
	MOVEI	REG1,"'"
	IDPB	REG1,REG2
	MOVEI	REG1,")"
	IDPB	REG1,REG2
	SETZ	REG1,
	IDPB	REG1,REG2
	DCSOUT	<[ASCIZ /LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	TSOUT	<[ASCIZ /   (Incorrect password.)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ / [Attaching]/],CRLF>
D$IND:	MOVE	REG1,[440700,,[ASCIZ /%TOP.DFTP.DFTP.GUEST/]]
	MOVE	REG2,[440700,,ABUF]
	SCOPY	(REG1,REG2)
	DCSOUT	<[ASCIZ /LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ /  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	REG1,[ASCII /%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII /N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ /MODIFY /],PBUF,<[ASCIZ /,M=/]>>
	MOVE	IOREG,ABUF
	DCNOUT	<IOREG>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ /CLOSE %OPEN/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ /LOGIN /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	REG1,[ASCII /%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII /N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR	<IOREG,UTIL>
	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIV/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCHAD:	DCSOUT	<[ASCIZ /DELETEP /],PBUF,<[ASCIZ /,N=1/]>,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DCHAD
	TSOUT	<[ASCIZ / [OK]/],CRLF>
DCHAI:	TAIN	<[ASCIZ / Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM	ABUF		; WRITE FLAG
	SETZM	<ABUF+1>	; HOST
	SETOM	<ABUF+2>	; SOCKET
	SETOM	<ABUF+3>	; PASSWORD
	TAIN	<[ASCIZ /  Allow control? /]>
	 JRST	DCHAI
	 SETOM	ABUF
	TAIN	<[ASCIZ /  Restrict via network? /]>
	 JRST	DCHAI
	 JRST	DCHAI3
	TSOUT	<[ASCIZ /   Site: /]>
	TNIN	([ASCIZ /   Site: /],10)
	 JRST	DCHAI
	JUMPE	IOREG,DCHAI1
	MOVEM	IOREG,<ABUF+1>
	TSOUT	<CRLF>
	TSOUT	<[ASCIZ /   Socket: /]>
	TNIN	([ASCIZ /   Socket: /],10)
	 JRST	DCHAI
	JUMPN	IOREG,DCHAI2
	TSOUT	<[ASCIZ /(Any)/]>
	JRST	DCHAI2
DCHAI1:	MOVE	IOREG,LHOST
	MOVEM	IOREG,<ABUF+1>
	TSOUT	<[ASCIZ /(Local)/],CRLF>
; (((NOT ITS OR SAIL)))
IFGE F.TENX,<
IFE F.SAIL,<
	TSOUT	<[ASCIZ /   User: /]>
; (((TOPS-10)))
IFE F.TENX,<
	TNIN	([ASCIZ /   User: /],10)
	 JRST	DCHAI
	LSH	IOREG,11
	ADDI	IOREG,100
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	TSIN	(UBUF1,LBUFS,[ASCIZ /   User: /])
	 JRST	DCHAI
	SETZ	REG1,
	MOVE	REG2,[440700,,UBUF1]
	STDIR
	 JRST	.+3
	 JRST	.+2
	JRST	.+4
	HRROI	REG1,[ASCIZ / (User not found.)
/]
	PSOUT
	JRST	DCHAI
	HRRZI	IOREG,(REG1)
	LSH	IOREG,↑D15
	ADDI	IOREG,20
>
>
>
; (((↑↑↑)))
IFL F.TENX,SETZ IOREG,
IFN F.SAIL,SETZ IOREG,
DCHAI2:	MOVEM	IOREG,<ABUF+2>
	TSOUT	<CRLF>
DCHAI3:	TAIN	<[ASCIZ /  Restrict via password? /]>
	 JRST	DCHAI
	 JRST	DCHAC
	TSOUT	<[ASCIZ /   Password: /]>
	TSIN	(<ABUF+3>,<SBUFS-3>,[ASCIZ /   Password: /])
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAC:	DCSOUT	<[ASCIZ /CREATEP /],PBUF,<[ASCIZ /,U=**,G=LR/]>>
	SKIPE	ABUF
	 JRST	DCHAC1
	DCSOUT	<[ASCIZ /C/]>
DCHAC1:	SKIPN	<ABUF+1>
	 JRST	DCHAC3
	DCSOUT	<<[ASCIZ /,H=/]>>
	MOVE	IOREG,<ABUF+1>
	DCNOUT	<IOREG>
	DCSOUT	<<[ASCIZ /,S=/]>>
	MOVE	IOREG,<ABUF+2>
	JUMPE	IOREG,DCHAC2
	DCNOUT	<IOREG>
	JRST	DCHAC3
DCHAC2:	DCSOUT	<[ASCIZ /ANY/]>
DCHAC3:	SETO	IOREG,
	CAMN	IOREG,<ABUF+3>
	 JRST	DCHAC4
	DCSOUT	<<[ASCIZ /,P='/]>,<ABUF+3>,[ASCIZ /'/]>
DCHAC4:	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ /  [OK]/],CRLF>
	JRST	DCHAI
	ENDR

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ / [Old Node]/],CRLF>
	JRST	DCON2
	RETURN
DCON1:	TAIN	<[ASCIZ / [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ /CREATE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	REG1,[440700,,PBUF]
	MOVE	REG2,[440700,,CONTEX]
	SCOPY	(REG1,REG2)
	ENDR

; DCOP -- COPY FILES WITHIN THE DATACOMPUTER
;
DCOP:	BEGINR	<FLAG>
	SETZ	FLAG,
	MOVE	REG1,[440700,,UBUF1]
	MOVE	REG2,[440700,,UBUF2]
	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	DCOP0
	JUMPN	REG3,.-4
	CALLR	DCOP$T
	RETURN
DCOP0:	DCSOUT	<[ASCIZ /OPEN /],GBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /LIST /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	DCOP1
	TAIN	<[ASCIZ / [Old File][Confirm]/]>
	 JRST	DCOPE3
	 JRST	DCOPE3
	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE3
	JRST	DCOP2
DCOP1:	TSOUT	<[ASCIZ / [New File]/],CRLF>
	SKIPN	PBUF
	 JRST	DCOP2
	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DCOP2
	DCSOUT	<[ASCIZ /CREATE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE2
	SETO	FLAG,
DCOP2:	DCSOUT	<[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE2
	DCSOUT	<UBUF1,[ASCIZ /=/],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE1
	DCSOUT	<[ASCIZ /CLOSE /],UBUF1,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE1
	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DCOPE1:	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	.+1
DCOPE2:	JUMPE	FLAG,DCOPE3
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+1
DCOPE3:	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	CALLR	RENDER
	 RETURN
	ENDR
; ('TEMPORARY FILE' COPY)
DCOP$T:	BEGINR
	DCSOUT	<[ASCIZ /LIST /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	DCOT1
	TAIN	<[ASCIZ / [Old File][Confirm]/]>
	 RETURN
	 RETURN
	JRST	DCOT2
DCOT1:	TSOUT	<[ASCIZ / [New File]/],CRLF>
DCOT2:	DCSOUT	<[ASCIZ /OPEN /],GBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /CREATE "<TEMPORARY" FILE"> LIKE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE1
	DCSOUT	<[ASCIZ /"<TEMPORARY" FILE">=/],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE2
	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE4
	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	.+1
	SKIPN	PBUF
	 JRST	DCOT3
	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DCOT3
	DCSOUT	<[ASCIZ /CREATE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE3
	SETO	FLAG,
DCOT3:	DCSOUT	<[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE "<TEMPORARY" FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE4
	DCSOUT	<UBUF1,[ASCIZ /="<TEMPORARY" FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE3
	DCSOUT	<[ASCIZ /CLOSE /],UBUF1,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE3
	DCSOUT	<[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DCOTE1:	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	CALLR	RENDER
	 RETURN
	RETURN
DCOTE2:	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	CALLR	RENDER
	 JRST	DCOTE4
	JRST	DCOTE4
DCOTE3:	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	.+1
	JUMPE	FLAG,DCOTE4
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+1
DCOTE4:	DCSOUT	<[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ /CREATE /],PBUF,<[ASCIZ /,M=/]>>
	MOVEI	IOREG,DEFALO
	DCNOUT	<IOREG>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR

; DDEL -- DELETE NODES/FILES
;
DDEL:	BEGINR
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DDEL0
	SKIPN	GBUF2
	 JRST	DDEL0
	DCSOUT	<[ASCIZ /DELETE /],GBUF2,SEMI>
	CALLR	RENDER
	 JRST	.+1
DDEL0:	DCSOUT	<[ASCIZ /LIST /],CONTEX,SEMI>
	CALLR	RENDER
	 JRST	.+2
	RETURN
	TSOUT	<[ASCIZ / [Connected To Attached Node]/],CRLF>
	MOVE	REG1,[ASCII /%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII /N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DDIR -- LIST THE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IOREG,UTIL>
	SETZ	UTIL,
	SETZM	GBUF1
	MOVE	REG1,[GBUF1,,GBUF1+1]
	BLT	REG1,<GBUF1+LBUFS-1>
	MOVEI	REG1,<GBUF2+1>
	MOVEM	REG1,GBUF2
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	CAIN	FLAG,DD$C
	 JRST	DDIRO1
	CAIN	FLAG,DD$P
	 JRST	DDIRO2
	CAIN	FLAG,DD$T
	 JRST	DDIRO3
	CAIN	FLAG,DD$V
	 JRST	DDIRO4
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %SOURCE/],SEMI>
	JRST	DDIRI
DDIRO2:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIVILEGE/],SEMI>
	JRST	DDIRI
DDIRO3:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %NAME/],SEMI>
	JRST	DDIRI
DDIRO4:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %INFORMATION/],SEMI>
DDIRI:	CALLR	RENPRE
	CAMN	IOREG,[ASCII /.I280/]
	 JRST	DDIRD
	CALLR	RENLIP
	JRST	DDIRER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRN:	DCBIN	<IOREG>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRN:	SKIPN	FLAGCO
	 JRST	DDIRN0
	HRROI	REG1,[ASCIZ / [Aborting]
/]
	PSOUT
	MOVE	REG1,DCOJFN
	MOVEI	REG2,22
	MTOPR
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	JRST	DDIRER
DDIRN0:	DCBIN	<IOREG>
>
; (((↑↑↑)))
	CAIE	IOREG," "
	 JRST	DDIRE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DDIRD
	CALLR	<(FLAG)>
	JRST	DDIRN
DDIRD:	CALLR	RENLIN
	JRST	DDIRN
DDIRE:	CAIN	IOREG,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DDIRER
	TSOUT	<[ASCIZ / [No Nodes]/],CRLF>
DDIRER:	CALLR	RENDER
	 RETURN
	ENDR

; DD$C -- CREATION
;
DD$C:	BEGINR	<IOREG>
	CALLR	DD$NAM
	 JRST	DD$C5
DD$C1:	DCBIN	<IOREG>
	CAIN	IOREG,15
	 JRST	DD$C3
	CAIE	IOREG,"*"
	 JRST	DD$C1
	MOVEI	IOREG,11
	TBOUT	<IOREG>
DD$C2:	DCBIN	<IOREG>
	CAIN	IOREG,15
	 JRST	DD$C4
	CAIN	IOREG,"*"
	 JRST	DD$C4
	TBOUT	<IOREG>
	JRST	DD$C2
DD$C3:	TSOUT	<[ASCIZ /	[Undated]/]>
DD$C4:	TSOUT	<CRLF>
DD$C5:	CALLR	RENLIN
	ENDR

; DD$P -- PROTECTION
;
DD$P:	BEGINR	<IOREG>
	CALLR	DD$NAM
	 JRST	DD$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DD$P1:	MOVEI	IOREG,GBUF1
DD$P2:	SKIPE	(IOREG)
	 AOJA	IOREG,DD$P2
	SUBI	IOREG,GBUF1
DD$P3:	TSOUT	<[ASCIZ /    /]>
	SOJGE	IOREG,DD$P3
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
DD$P4:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	DD$P4
	ENDR

; DD$T -- TERSE
;
DD$T:	BEGINR	<IOREG>
	CALLR	DD$NAM
	 JRST	DD$T4
	DCBIN	<IOREG>
	CAIN	IOREG,"F"
	 JRST	DD$T1
	CAIN	IOREG,"P"
	 JRST	DD$T2
	JRST	DD$T3
DD$T1:	TSOUT	<[ASCIZ / 	[F]/]>
	JRST	DD$T3
DD$T2:	TSOUT	<[ASCIZ / 	[P]/]>
DD$T3:	TSOUT	<CRLF>
DD$T4:	CALLR	RENLIN
	ENDR

; DD$V -- VERBOSE
;
DD$V:	BEGINR	<IOREG,UTIL,FLAG>
DD$VN:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DD$VN
	CALLR	DD$NAM
	 JRST	DD$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DD$VF:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DD$VF
	DCBIN	<IOREG>
	SETZ	FLAG,
	CAIN	IOREG,"F"
	 MOVEI	FLAG,3
	CAIN	IOREG,"P"
	 MOVEI	FLAG,1
	CAIN	IOREG,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DD$VE
	CALLR	RENLIN
DD$VD:	MOVEI	IOREG,(UTIL)
DD$VD0:	TSOUT	<[ASCIZ /    /]>
	SOJGE	IOREG,DD$VD0
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
DD$VD1:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	DD$VD1
	SOJG	FLAG,DD$VD
	RETURN
DD$VE:	CALLR	RENLIN
	ENDR

; DD$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IOREG -- LAST CHARACTER INPUT
;
DD$NAM:	BEGINR	<BPREG,UTIL,FLAG,R10>
	SETZ	R10,
	SETZ	FLAG,
	MOVE	BPREG,[440700,,ABUF]
	MOVEI	UTIL,<SBUFS*5>
	DCBIN	<IOREG>
	CAILE	IOREG," "
	 JRST	DD$NA1
	RETURN
DD$NAN:	DCBIN	<IOREG>
DD$NA1:	CAIN	IOREG,"."
	 JRST	DD$NIN
	CAIG	IOREG," "
	 JRST	DD$NA3
	CAIE	IOREG,42
	 JRST	DD$NA2
	DCBIN	<IOREG>
DD$NA2:	IDPB	IOREG,BPREG
	SOJG	UTIL,DD$NAN
	JRST	DD$NER
DD$NA3:	SETZ	REG1,
	IDPB	REG1,BPREG
	TSOUT	<[ASCIZ /  /],ABUF>
	RETURN	SKIP,1
DD$NIN:	MOVE	BPREG,[440700,,ABUF]
	MOVEI	UTIL,<SBUFS*5>
DD$NI1:	DCBIN	<IOREG>
	CAIN	IOREG,"."
	 JRST	DD$NCN
	CAIG	IOREG," "
	 JRST	DD$NCN
DD$NI2:	CAIE	IOREG,42
	 JRST	DD$NI3
	DCBIN	<IOREG>
DD$NI3:	IDPB	IOREG,BPREG
	SOJG	UTIL,DD$NI1
	JRST	DD$NER
DD$NCN:	SETZ	REG1,
	IDPB	REG1,BPREG
	SKIPN	REG2,GBUF1(FLAG)
	 JRST	DD$NON
	HRLI	REG2,440700
	MOVE	REG1,[440700,,ABUF]
DD$NC1:	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	DD$NON
	JUMPN	REG3,DD$NC1
	CAIG	IOREG," "
	 RETURN	SKIP,1
	AOJA	FLAG,DD$NIN
DD$NON:	CAIL	FLAG,LBUFS-2
	 JRST	DD$NER
	SETZM	GBUF1+1(FLAG)
	HRL	REG1,GBUF1+1(FLAG)
	HRR	REG1,GBUF1+2(FLAG)
	BLT	REG1,<GBUF1+LBUFS-1>
	MOVE	REG1,[440700,,ABUF]
	SKIPN	REG2,GBUF1(FLAG)
	 HRR	REG2,GBUF2
	HRLI	REG2,440700
	HRRZI	BPREG,(BPREG)
	SUBI	BPREG,<ABUF-1>
	ADDI	BPREG,(REG2)
	CAIL	BPREG,<GBUF2+LBUFS>
	 JRST	DD$NER
	HRRZM	REG2,GBUF1(FLAG)
DD$NO1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,DD$NO1
	HRRZI	REG2,1(REG2)
	MOVEM	REG2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DD$NO2
	TSOUT	<CRLF>
DD$NO2:	TSOUT	<[ASCIZ /    /]>
	SOJGE	UTIL,DD$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IOREG," "
	 RETURN	SKIP,1
	AOJA	FLAG,DD$NIN
DD$NER:	TSOUT	<[ASCIZ / (Pathname too long.)/],CRLF>
	ENDR

; DGET -- GET-RETRIEVE (NETWORK TO LOCAL)
;
DGET:	BEGINR	<IOREG,UTIL>
	DCSOUT	<[ASCIZ /OPEN /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /LIST /],ABUF,[ASCIZ / %SOURCE/],SEMI>
	MOVE	UTIL,[440700,,GBUF1]
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I280/]
	 JRST	DGET3
	CALLR	RENLIN
DGET1:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 JRST	DGET4
	CAIE	IOREG,"*"
	 JRST	DGET1
DGET2:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 JRST	DGET4
	CAIN	IOREG,"*"
	 JRST	DGET3
	IDPB	IOREG,UTIL
	JRST	DGET2
DGET3:	CALLR	RENLIN
DGET4:	SETZ	IOREG,
	IDPB	IOREG,UTIL
	CALLR	RENDER
	 JRST	.+1
	CALLR	NETNI
	DCSOUT	<[ASCIZ /CONNECT "<PORT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DGETE5
; (((TOPS-10)))
IFE F.TENX,<
	CALLR	LOCDG
>
; (((↑↑↑)))
	CALLR	LOCOO
	 JRST	DGETE3
	DCSOUT	<[ASCIZ /"<PORT">=/],ABUF,SEMI>
	CALLR	NETOI
	 JRST	DGETE2
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;J205/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I240/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I249/]
	 JRST	DGETE1
	CALLR	RENLIN
	TSOUT	<[ASCIZ / [OK]/],CRLF>
	CALLR	MOVNL
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I260/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I269/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	MOVC
	CALLR	NETC
; (((TENEX+ITS)))
IFN F.TENX,<
	CALLR	LOCDG
>
; (((↑↑↑)))
	CALLR	LOCC
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DGETE3
	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DGETE4
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGTT
	 CALLR	MOVR
	RETURN	SKIP,1
DGETE1:	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CALLR	RENLIP
	CALLR	NETC
DGETE2:	CALLR	RENDER
	 JRST	.+1
	CALLR	LOCC
DGETE3:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DGETE4:	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DGETE5:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IOREG,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBUFS,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLIN0
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLIN0:	CAIE	IOREG,33
	 JRST	DLINE
	TSOUT	<CRLF>
DLINA:	TSOUT	<[ASCIZ /$/]>
	TSIN	(ANCHOR,SBUFS,[ASCIZ /$/])
	 JRST	DLINI
	TSOUT	<CRLF>
	JUMPE	UTIL,DLINA
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ /[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR

; DPUT -- PUT-STORE (LOCAL TO NETWORK)
;
DPUT:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	FLAG,
	CALLR	LOCOI
	 RETURN
	CALLR	LOCDP
	CALLR	LOCS
	JUMPG	UTIL,DPUT1
	TSOUT	<[ASCIZ / (Empty local file.)/],CRLF>
	JRST	DPUTE6
DPUT1:	CAMG	UTIL,[SIZPAG*SIZFIL]
	 JRST	DPUT2
	TSOUT	<[ASCIZ / (Local file too large.)/],CRLF>
	JRST	DPUTE6
DPUT2:	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	DPUT3
	TAIN	<[ASCIZ / [Old File][Confirm]/]>
	 JRST	DPUTE6
	 JRST	DPUTE6
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE6
	JRST	DPUT4
DPUT3:	TSOUT	<[ASCIZ / [New File]/],CRLF>
	SKIPN	GBUF2
	 JRST	DPUT4
	DCSOUT	<[ASCIZ /LIST /],GBUF2,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DPUT4
	DCSOUT	<[ASCIZ /CREATE /],GBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE6
	SETO	FLAG,
DPUT4:	DCSOUT	<[ASCIZ /CREATE /],PBUF,<[ASCIZ / FILE STRING (0,/]>>
	DCNOUT	<UTIL>
	DCSOUT	<<[ASCIZ \),B=36,S=BINARY /*\]>,GBUF1,[ASCIZ \*/\],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE5
	CALLR	NETNO
	DCSOUT	<[ASCIZ /CONNECT "<PORT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE4
	DCSOUT	<ABUF,[ASCIZ /="<PORT">/],SEMI>
	CALLR	NETOO
	 JRST	DPUTE3
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;J205/]
	 JRST	DPUTE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I230/]
	 JRST	DPUTE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I239/]
	 JRST	DPUTE1
	CALLR	RENLIN
	CALLR	MOVLN
	CALLR	NETC
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I250/]
	 JRST	DPUTE2
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I259/]
	 JRST	DPUTE2
	CALLR	RENLIN
	CALLR	MOVC
	CALLR	LOCC
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE7
	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE7
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGTT
	 CALLR	MOVR
	RETURN	SKIP,1
DPUTE1:	CALL	NETC
DPUTE2:	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CALLR	RENLIP
DPUTE3:	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUTE4:	DCSOUT	<[ASCIZ /DELETE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUTE5:	JUMPE	FLAG,DPUTE6
	DCSOUT	<[ASCIZ /DELETE /],GBUF2,SEMI>
	CALLR	RENDER
	 JRST	.+1
DPUTE6:	CALLR	LOCC
	RETURN
DPUTE7:	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /DELETE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /DELETE /],GBUF2,SEMI>
	CALLR	RENDER
	 RETURN
	ENDR

; DVER -- VERIFY EQUIVALENCE OF LOCAL AND REMOTE DATA
;
DVER:	BEGINR	<IOREG,UTIL>
	CALLR	LOCOI
	 RETURN
	DCSOUT	<[ASCIZ /OPEN /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE6
	CALLR	NETNI
	DCSOUT	<[ASCIZ /CONNECT "<PORT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE5
	DCSOUT	<[ASCIZ /"<PORT">=/],ABUF,SEMI>
	CALLR	NETOI
	 JRST	DVERE2
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;J205/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I240/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I249/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	MOVV
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I260/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I269/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	MOVC
	CALLR	NETC
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE3
	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE4
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	CALLR	LOCC
	RETURN	SKIP,1
DVERE1:	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CALLR	RENLIP
	CALLR	NETC
DVERE2:	CALLR	RENDER
	 JRST	.+1
DVERE3:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DVERE4:	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	CALLR	LOCC
	RETURN
DVERE5:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DVERE6:	CALLR	LOCC
	ENDR

; MOVC -- CHECKSUM TEST
;
MOVC:	BEGINR	<IOREG,FLAG>
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I275/]
	 JRST	MOVC2
	SETZ	FLAG,
MOVC1:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	MOVC1
	SKIPN	FLAG
	 SOJA	FLAG,MOVC1
	CALLR	DCNIN
	CAME	IOREG,MOVSUM
	 JRST	MOVC3
	CALLR	RENLIN
	RETURN
MOVC2:	CALLR	RENLIP
	RETURN
MOVC3:	TSOUT	<[ASCIZ / (Network Checksum Error.)/],CRLF>
	CALLR	RENLIN
	ENDR

; MOVR -- CALCULATE AND PRINT MOVE RATE
;
MOVR:	BEGINR	<IOREG,<IOREG+1>>
	TSOUT	<[ASCIZ / (/]>
	MOVEI	IOREG,↑D36
	IMULB	IOREG,MOVSPA
	IDIV	IOREG,MOVTIM
	TNOUT	<IOREG>
	TSOUT	<[ASCIZ / Baud (/]>
	MOVE	IOREG,MOVSPA
	TNOUT	<IOREG>
	TSOUT	<[ASCIZ / bits in /]>
	MOVE	IOREG,MOVTIM
	CAIN	IOREG,0
	 MOVEI	IOREG,1
	TNOUT	<IOREG>
	HRRZI	<IOREG+1>,[ASCIZ / seconds))/]
	CAIN	IOREG,1
	 HRRZI	<IOREG+1>,[ASCIZ / second))/]
	TSOUT	<(IOREG+1),CRLF>
	ENDR

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	FLAG,
RENDIL:	CALLR	RENPRE
	CAMN	IOREG,[ASCII /.I220/]
	 JRST	RENDES
	CAMN	IOREG,[ASCII /.I210/]
	 JRST	RENDRR
	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIN	UTIL,"!"
	 JRST	RENDPM
	SKIPE	FLAGDE
	 JRST	RENDPT
RENDNM:	CALLR	RENLIN
	JRST	RENDIL
RENDPT:	SETZM	FLAGDE
	CAIN	UTIL,";"
	 JRST	RENDNM
	CAIN	UTIL,"."
	 JRST	RENDNM
RENDPM:	CALLR	RENLIP
	JRST	RENDIL
RENDES:	CALLR	RENLIN
	MOVEI	IOREG,"L"-100
	DCBOUT	<IOREG>
	AOJA	FLAG,RENDIL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IOREG>
RENLNL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IOREG>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 RETURN
	CAIE	IOREG,11
	 JRST	RENLPF
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	MOVEI	IOREG,"("
RENLPP:	TBOUT	<IOREG>
	DCBIN	<IOREG>
	CAIE	IOREG,15
	 JRST	RENLPP
	DCBIN	<IOREG>
	MOVEI	IOREG,")"
	TBOUT	<IOREG>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BPREG,UTIL,FLAG>
	SETZ	IOREG,
	MOVE	BPREG,[440700,,IOREG]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BPREG
	SOJG	FLAG,RENPRL
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ / ?? Fatal DATACOMPUTER error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
	.VALUE
	.BREAK 16,160000
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))

; ***I/O ROUTINES***

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: REG1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IOREG>
	MOVEI	IOREG,(REG1)
	TSOUT	<(IOREG)>
TAIN1:	TBIN	<IOREG>
	CAIN	IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TAIN1
	CAIN	IOREG,177
	 JRST	TAIN2
	CAIN	IOREG,"N"
	 JRST	TAIN3
	CAIN	IOREG,"Y"
	 JRST	TAIN4
	CAIN	IOREG,12
	 JRST	TAIN5
	CAIN	IOREG,33
	 JRST	TAIN5
	CAIN	IOREG,37
	 JRST	TAIN5
	CAIN	IOREG," "
	 JRST	TAIN5
	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TAIN1
TAIN2:	TSOUT	<[ASCIZ /XXX/],CRLF>
	RETURN
TAIN3:	TSOUT	<[ASCIZ /No/],CRLF>
	RETURN	SKIP,1
TAIN4:	TSOUT	<[ASCIZ /Yes/]>
TAIN5:	TSOUT	<CRLF>
	ENDR	SKIP,2

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[440700,,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIN	TCIO,"A"-100
	 JRST	TCIDEL
	CAIN	TCIO,"X"-100
	 JRST	TCIENR
	CAIN	TCIO,177
	 JRST	TCIENR
	CAIN	TCIO,15
IFL F.TENX,MOVEI TCIO,12
IFGE F.TENX,JRST TCICHR
	CAIN	TCIO,12
	 JRST	TCIC01
	CAIN	TCIO,37
	 JRST	TCIC01
	CAIN	TCIO," "
	 JRST	TCIC01
	CAIN	TCIO,33
	 JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	AOJ	TCIMAC,
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	JRST	TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIN	TCIO,12
	 JRST	TCIC09
	CAIN	TCIO,37
	 JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,33
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[440700,,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIBAD	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	SOJ	TCIBP,		; FIX LINE BYTE PTR
	IBP	TCIBP
	IBP	TCIBP
	IBP	TCIBP
	IBP	TCIBP
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	SOJ	TCISBP,		; FIX SCAN BYTE PTR
	IBP	TCISBP
	IBP	TCISBP
	IBP	TCISBP
	IBP	TCISBP
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2

; TERMINAL STRING INPUT
;   IN: IOREG -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IOREG -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BPREG,R10,R11,R12>
	MOVE	R10,IOREG
	MOVE	R11,UTIL
	HLR	BPREG,IOREG
	HRLI	BPREG,440700
	SETZ	UTIL,
TSICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	TSIREP
	CAIN	IOREG,"A"-100
	 JRST	TSIDEL
	CAIN	IOREG,"X"-100
	 JRST	TSIENR
	CAIN	IOREG,177
	 JRST	TSIENR
	CAIN	IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TSICHR
	CAIN	IOREG,12
	 JRST	TSIEND
	CAIN	IOREG,33
	 JRST	TSIEND
	CAIN	IOREG,37
	 JRST	TSIEND
	CAIGE	IOREG," "
	 JRST	TSIBAD
	CAIL	UTIL,(R10)
	 JRST	TSIBAD
	IDPB	IOREG,BPREG
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IOREG>
	JRST	TSICHR
TSIBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IOREG,(BPREG)
	HLR	R12,R10
	CAIGE	IOREG,(R12)
	 JRST	TSICHR
	HRLI	R12,440700
TSIR01:	CAMN	R12,BPREG
	 JRST	TSICHR
	ILDB	IOREG,R12
	TBOUT	<IOREG>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IOREG>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETO	IOREG,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BPREG
	ENDR	SKIP,1

; TERMINAL NUMBER INPUT
;   IN: IOREG -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IOREG -- NUMBER
;
$TNIN$:	BEGINR	<BPREG,UTIL,FLAG>
	MOVE	UTIL,IOREG
	MOVE	BPREG,[440700,,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	TNIREP
	CAIN	IOREG,"A"-100
	 JRST	TNIDEL
	CAIN	IOREG,"X"-100
	 JRST	TNIENR
	CAIN	IOREG,177
	 JRST	TNIENR
	CAIN	IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TNICHR
	CAIN	IOREG,12
	 JRST	TNIEND
	CAIN	IOREG,33
	 JRST	TNIEND
	CAIN	IOREG,37
	 JRST	TNIEND
	CAIN	IOREG," "
	 JRST	TNIEND
	CAIGE	IOREG,"0"
	 JRST	TNIBAD
	CAIL	IOREG,"0"(UTIL)
	 JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IOREG,UTIL
	TSOUT	<(IOREG)>
	HRRZI	IOREG,(BPREG)
	CAIGE	IOREG,UBUF1
	 JRST	TNICHR
	MOVE	IOREG,[440700,,UBUF1]
TNIR01:	CAMN	IOREG,BPREG
	 JRST	TNICHR
	ILDB	REG1,IOREG
	TBOUT	<REG1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	TBOUT	<IOREG>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETZ	IOREG,
	RETURN
TNIEND:	SETZ	IOREG,
	IDPB	IOREG,BPREG
	MOVE	BPREG,[440700,,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BPREG
	JUMPE	UTIL,RETN(1)
	IMULI	IOREG,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IOREG,(UTIL)
	JRST	TNICAL
	ENDR

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IOREG -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IOREG+1>,UTIL>
	SETZ	IOREG,
DCNIN1:	DCBIN	<UTIL>
	CAIGE	UTIL,"0"
	 RETURN
	CAILE	UTIL,"9"
	 RETURN
	JUMPL	IOREG,DCNIN2
	MULI	IOREG,↑D10
	CAILE	IOREG,1
	 JRST	DCNIN2
	CAIN	IOREG,1
	 TLO	<IOREG+1>,400000
	MOVE	IOREG,<IOREG+1>
	ADDI	IOREG,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IOREG,
	JRST	DCNIN1
	ENDR

; $NOUT$ -- INTEGER OUTPUT
;   IN: REG1 -- INTEGER
;       REG2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,REG2
	MOVE	REG3,[440700,,UBUF1]
	MOVEI	REG4,1
	JUMPGE	REG1,NOUT1
	LSHC	REG1,-↑D35
	LSH	REG2,-1
	DIVI	REG1,(FLAG)
	JRST	.+2
NOUT1:	IDIVI	REG1,(FLAG)
	ADDI	REG2,60
	IDPB	REG2,REG3
	SKIPE	REG1
	 AOJA	REG4,NOUT1
	MOVE	REG1,[440700,,UBUF2]
NOUT2:	LDB	REG2,REG3
	IDPB	REG2,REG1
	SOJ	REG3,
	IBP	REG3
	IBP	REG3
	IBP	REG3
	IBP	REG3
	SOJG	REG4,NOUT2
	IDPB	REG4,REG1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR

; ***SYSTEM DEPENDENT ROUTINES***

; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTI,[.UAI,,'TTY']		; TTY input
	 THUD
	.CALL [	SETZ
		SIXBIT/TTYGET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVEM			; first set of character groups
		MOVEM			; second set of character groups
		SETZM REG1]		; TTYSTS variable
	 THUD
	TLO REG1,200			; disable **MORE** processing
	MOVE [030303,,030303]		; turn off echoing
	.CALL [	SETZ
		SIXBIT/TTYSET/		; set TTY parameters
		MOVEI TTI		; TTY channel
		MOVE			; first set of character groups
		MOVE			; second set of character groups
		SETZ REG1]		; TTYSTS variable
	 THUD
	.OPEN TTO,[.UAO,,'TTY']		; TTY output
	 THUD
	.CALL [	SETZ			; host number
		SIXBIT/NETHST/
		MOVEI -1
		MOVEM
		SETZM LHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; OPEN on gensymmed socket, 32 bits
		MOVEI ICP
		[('NET')]		; network device
		[-1]			; initial local socket is gensymmed
		MOVEI DCSOKT		; initial foreign socket(DATACOMPUTER)
		SETZI DCHOST]		; foreign host(CCA)
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI ICP
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	MOVE REG1,[ICP,,RCHBLK]
	.RCHST REG1,			; get status of network channel
	HRRE REG1,RCHBLK+4		; get status of network
	JUMPL REG1,NETDED		; network dead if .LE. 0
	CAIN REG1,%NSCLI		; CLS w/ input?
	 JRST ICPWIN
	CAIN REG1,%NSINP		; input available?
	 CAIN REG1,%NSOPN		; connection open?
	  JRST ICPWIN
	JUMPN REG1,[THUD]		; any other condition is lossage
ICPCLS:	TSOUT <[ASCIZ/Cannot establish network connection/]>
	.BREAK 16,160000
NETDED:	TSOUT <[ASCIZ/ARPAnet is down/]>
	.BREAK 16,160000
ICPWIN:	MOVE REG1,RCHBLK+1		; get gensymmed local socket
	ADDI REG1,2			; receive
	MOVEM REG1,LCLRCV
	ADDI REG1,1			; transmit
	MOVEM REG1,LCLTRN
	.IOT ICP,REG1			; get foreign place's socket
	.CLOSE ICP,			; free up ICP socket right away
	MOVEM REG1,FORRCV		; receive
	ADDI REG1,1			; socket to me!
	MOVEM REG1,FORTRN
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI		; DATACOMPUTER input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAO
		MOVEI DCO		; DATACOMPUTER output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCO
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	MOVEI REG1,2			; offset for data sockets
	ADDM REG1,LCLRCV
	ADDM REG1,LCLTRN
	ADDM REG1,FORRCV
	ADDM REG1,FORTRN
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	.IOT DCO,["Z"-100]		; SEND QUIT
QUIT1:	DCBIN <IOREG>
	JUMPGE IOREG,QUIT1
	.CLOSE DCI,
	.CLOSE DCO,
	.BREAK 16,160000

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI DDI		; DATACOMPUTER data input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDI
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI DDO		; DATACOMPUTER data output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDO
		MOVEI %NSRFS
		SETZM REG1]		; wait for connection
	 THUD
	JUMPE REG1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	.CLOSE DDI,
	.CLOSE DDO,
	ENDR

; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;
NETNI:	BEGINR
	MOVE UTIL,LCLRCV
	ENDR

; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;
NETNO:	BEGINR
	MOVE UTIL,LCLTRN
	ENDR

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		LCLDEV
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOI1
	RETURN SKIP,1
LOCOI1:	TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI LCO
		LCLDEV
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOO1
	RETURN SKIP,1
LOCOO1:	TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	.CLOSE LCI,
	.CLOSE LCO,
	ENDR

; LOCS -- LOCAL FILE (SIZE)
;
LOCS:	BEGINR
	.CALL [	SETZ
		SIXBIT/FILLEN/
		MOVEI LCI
		SETZM UTIL]
	 SETZ UTIL,			; it should not crap out
	ENDR

; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR <BPREG,UTIL>
	MOVE BPREG,[POINT 7,GBUF1]
	ILDB UTIL,BPREG
	JUMPE UTIL,RETN(0)
	CAIN UTIL," "
	 MOVEI UTIL,"0"
	MOVEI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	ILDB UTIL,BPREG
	CAIE UTIL,"-"
	 RETURN
	MOVE REG2,[POINT 7,REG3]
	SETZ REG3,
	ILDB UTIL,BPREG
	IDPB UTIL,REG2
	ILDB UTIL,BPREG
	IDPB UTIL,REG2
	ILDB UTIL,BPREG
	IDPB UTIL,REG2
	MOVEI REG2,↑D12
	CAMN REG3,LOCDM-1(REG2)
	 JRST .+3
	  SOJGE REG2,.-2
	  RETURN
	ILDB UTIL,BPREG
	CAIE UTIL,"-"
	 RETURN
	ILDB UTIL,BPREG
	MOVEI REG3,-"0"(UTIL)
	IMULI REG3,↑D10
	ILDB UTIL,BPREG
	ADDI REG3,-"0"(UTIL)
	LSH REG3,↑D27
	LSH REG2,↑D23
	ADD REG3,REG2
	MOVS REG1,REG1
	ADD REG3,REG1
	ILDB UTIL,BPREG
	CAIE UTIL," "
	 RETURN
	ILDB UTIL,BPREG
	MOVEI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,6
	ILDB UTIL,BPREG
	CAIE UTIL,":"
	 RETURN
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,6
	ILDB UTIL,BPREG
	JUMPE UTIL,LOCDG1		; ALLOW FOR TOPS-10SES
	CAIE UTIL,":"
	 RETURN
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	IMULI REG1,↑D10
	ILDB UTIL,BPREG
	ADDI REG1,-"0"(UTIL)
	LSH REG1,1
	CAIA
LOCDG1:	 IMULI REG1,↑D20
	ADDI REG3,(REG1)
	.CALL [	SETZ
		SIXBIT/SFDATE/
		MOVEI LCO
		SETZ REG3]
	 JFCL
	ENDR

; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	.CALL [	SETZ
		SIXBIT/RFDATE/
		MOVEI LCI
		SETZM REG2]
	 MOVSI REG2,124201		; ASSUME APRIL 1, 1984
	MOVE REG1,[POINT 7,GBUF1]
	LDB REG3,[POINT 5,REG2,17]	; DAY
	IDIVI REG3,↑D10
	ADDI REG3,"0"
	CAIN REG3,"0"
	 MOVEI REG3," "
	ADDI REG4,"0"
	IDPB REG3,REG1
	IDPB REG4,REG1
	MOVEI REG3,"-"
	IDPB REG3,REG1
	LDB REG3,[POINT 4,REG2,12]	; MONTH
	HRRI REG3,LOCDM-1(REG3)
	HRLI REG3,(POINT 7,)
	SCOPY (REG3,REG1)
	MOVEI REG3,"-"
	IDPB REG3,REG1
	LDB REG3,[POINT 7,REG2,8]	; YEAR
	IDIVI REG3,↑D10
	ADDI REG3,"0"
	ADDI REG4,"0"
	IDPB REG3,REG1
	IDPB REG4,REG1
	MOVEI REG3," "
	IDPB REG3,REG1
	LDB REG2,[POINT 17,REG2,34]	; TIME IN SECONDS
	IDIVI REG2,↑D3600
	MOVEI REG4,(REG3)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,REG1
	IDPB REG3,REG1
	MOVEI REG2,":"
	IDPB REG2,REG1
	MOVEI REG2,(REG4)
	IDIVI REG2,↑D60
	MOVEI REG4,(REG3)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,REG1
	IDPB REG3,REG1
	MOVEI REG2,":"
	IDPB REG2,REG1
	MOVEI REG2,(REG4)
	IDIVI REG2,↑D10
	ADDI REG2,"0"
	ADDI REG3,"0"
	IDPB REG2,REG1
	IDPB REG3,REG1
	SETZ REG2,
	IDPB REG2,REG1
	ENDR				; return

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM:	ASCII/JAN/
	ASCII/FEB/
	ASCII/MAR/
	ASCII/APR/
	ASCII/MAY/
	ASCII/JUN/
	ASCII/JUL/
	ASCII/AUG/
	ASCII/SEP/
	ASCII/OCT/
	ASCII/NOV/
	ASCII/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR <IOREG>
	MOVSI REG1,'DSK'		; set defaults
	MOVEM REG1,LCLDEV
	.SUSET [.RSNAME,,LCLSNM]
	SETZM LCLFN1			; < prevent assembly error
	MOVSI REG1,'>  '
	MOVEM REG1,LCLFN2
	HRLI IOREG,(POINT 7,)
LUTFN1:	CALLR LUTWRD			; get a SIXBIT word
	JUMPE REG1,LUTF1A
	CAIN REG2,":"			; device
	 JRST [	MOVEM REG1,LCLDEV
		JRST LUTFN1]
	CAIN REG2,";"			; SNAME
	 JRST [	MOVEM REG1,LCLSNM
		JRST LUTFN1]
	SKIPN LCLFN1			; FN1
	 JRST [	MOVEM REG1,LCLFN1
		JRST LUTF1A]
	MOVEM REG1,LCLFN2		; FN2
LUTF1A:	JUMPN REG2,LUTFN1
	ENDR

; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN REG1, DELIMITER IN REG2
;
LUTWRD:	BEGINR <BPREG>
	SETZ REG1,			; initialize word, word pointer
	MOVE BPREG,[POINT 6,REG1]
LUTWR1:	ILDB REG2,IOREG			; get a character from buffer
	CAIE REG2,":"
	 CAIN REG2,";"
	  JRST RETN(0)
	CAIN REG2," "
	 JRST RETN(0)
	JUMPE REG2,RETN(0)
	SUBI REG2," "			; SIXBITify from ASCII
	TRNN REG1,77			; and save in word until word filled
	 IDPB REG2,BPREG
	JRST LUTWR1
	ENDR

; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN:	BEGINR <UTIL>
	CALLR LOCS			; get length of file
	MOVEM UTIL,MOVSPA
	SETZM MOVSUM
	.RDTIM REG1,
	IDIVI REG1,↑D30
	MOVEM REG1,MOVTIM
MOVLN1:	MOVE REG1,[-2000,,IOBUFR]
	.IOT LCI,REG1			; read 1K from local file
	JUMPL REG1,MOVLN2		; hit EOF here
	MOVE REG1,[-2000,,IOBUFR]
	.IOT DDO,REG1
	MOVSI REG1,-2000		; compute checksum
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
	JRST MOVLN1
MOVLN2:	MOVEI REG1,-IOBUFR(REG1)	; get # of words transferred
	JUMPE REG1,MOVLN3
	MOVNS REG1
	HRLZS REG1
	PUSH STAK,REG1
	HRRI REG1,IOBUFR
	.IOT DDO,REG1
	POP STAK,REG1
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
MOVLN3:	.RDTIM REG1,
	IDIVI REG1,↑D30
	SUBM REG1,MOVTIM
	ENDR

; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL:	BEGINR
	SETZM MOVSPA
	SETZM MOVSUM
	.RDTIM REG1,
	IDIVI REG1,↑D30
	MOVEM REG1,MOVTIM
MOVNL1:	MOVE REG1,[-2000,,IOBUFR]
	.IOT DDI,REG1			; read 1K from DATACOMPUTER
	JUMPL REG1,MOVNL2		; hit EOF here
	MOVEI REG1,2000
	ADDM REG1,MOVSPA
	MOVE REG1,[-2000,,IOBUFR]
	.IOT LCO,REG1
	MOVSI REG1,-2000		; compute checksum
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
	JRST MOVNL1
MOVNL2:	MOVEI REG1,-IOBUFR(REG1)	; get # of words transferred
	JUMPE REG1,MOVLN3
	ADDM REG1,MOVSPA
	MOVNS REG1
	HRLZS REG1
	PUSH STAK,REG1
	HRRI REG1,IOBUFR
	.IOT LCO,REG1
	POP STAK,REG1
	MOVE REG2,IOBUFR(REG1)
	ADDM REG2,MOVSUM
	AOBJN REG1,.-2
MOVNL3:	.RDTIM REG1,
	IDIVI REG1,↑D30
	SUBM REG1,MOVTIM
	ENDR

; MOVV -- VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR <IOREG,UTIL,FLAG>
	SETZB UTIL,FLAG
	SETZM MOVSUM
MOVV0:	MOVE REG1,[-1000,,IOBUFR]
	.IOT DDI,REG1
	MOVE REG2,[-1000,,IOBUFR+1000]
	.IOT LCI,REG2
	HLLZ REG3,REG1
	HLLZ REG4,REG2
MOVV1:	MOVEI REG1,-IOBUFR(REG1)
	JUMPE REG1,MOVV2
	SETZ REG2,
MOVV01:	CAIN FLAG,0
	 ADDI UTIL,1
	MOVE IOREG,IOBUFR(REG2)
	ADDM IOREG,MOVSUM
	CAME IOREG,IOBUFR+1000(REG2)
	 ADDI FLAG,1
	ADDI REG2,1
	SOJG REG1,MOVV01
	CAMN REG3,REG4			; file sizes match?
	 JRST MOVV0
	CAML REG3,REG4			; DATACOMPUTER file smaller?
	 JRST MOVV4
	JRST MOVV5			; no
MOVV2:	JUMPN FLAG,MOVV3
	TSOUT <[ASCIZ / [OK]/],CRLF>
	RETURN
MOVV3:	CAIE FLAG,1
	 JRST MOVV3A
	TSOUT <[ASCIZ / (There is one different word at /]>
	JRST MOVV03
MOVV3A:	TSOUT <[ASCIZ / (There are /]>
	TNOUT <FLAG>
	TSOUT <[ASCIZ / different words.  The first difference is at /]>
MOVV03:	TNOUT <UTIL>
	TSOUT <[ASCIZ /.)/],CRLF>
	RETURN
MOVV4:	MOVE REG1,[-1000,,IOBUFR]
	.IOT DDI,REG1		; it gets upset if you don't read everything
	MOVEI REG2,-IOBUFR(REG1)
	JUMPE REG2,MOVV04
	MOVE IOREG,IOBUFR-1(REG2)
	ADDM IOREG,MOVSUM
	SOJG REG2,.-2
	JUMPL REG1,MOVV04
	JRST MOVV4
MOVV04:	TSOUT <[ASCIZ / (The datacomputer file is larger than the local file.)/],CRLF>
	RETURN
MOVV5:	TSOUT <[ASCIZ / (The local file is larger than the datacomputer file.)/],CRLF>
	ENDR

>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
	CALLR	ICP
	ENDR

; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IOREG,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IOREG,LINP		; LISTEN ON INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IOREG,DCIBLK+.IBERR
	CAIE	IOREG,.IESKT
	 JRST	ICPEIL
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	REG3,
	SETZ	FLAG,
ICPRDV:	MOVE	IOREG,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IOREG,WRKBLK+.IBDEV
	MOVEI	REG1,(REG3)
	IDIVI	REG1,10
	JUMPE	REG1,ICPRD1
	ADDI	REG1,20
	ADDI	REG2,20
	DPB	REG1,[140600,,WRKBLK+.IBDEV]
	DPB	REG2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	REG2,20
	DPB	REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IOREG,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD3
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	REG2,(REG1)
	 JRST	ICPRD3
	MOVE	IOREG,WRKBLK+.IBLCL
	CAMN	IOREG,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IOREG,2
	CAMN	IOREG,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IOREG,1			; OUTPUT DATA SOCKET
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IOREG,WRKBLK+.IBHST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD4
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT
	CAIE	REG2,(REG1)
	 JRST	ICPRD4
	MOVE	IOREG,WRKBLK+.IBLCL
	SUBI	IOREG,3
	CAMN	IOREG,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	REG3,1
	CAIGE	REG3,(REG4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ / (Connections in use.)/]
	EXIT
ICPCLS:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IOREG,1
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / (Retrieve interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / (Store interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IOREG,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IOREG,DCCHAS+1
	MOVE	IOREG,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IOREG,OICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IOREG,ICPBUF+1
	MOVE	IOREG,1(IOREG)		; GET THE SOCKET NUMBER
	LSH	IOREG,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IOREG,DCOBLK+.IBRMT
	AOJ	IOREG,
	MOVEM	IOREG,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,OINP		; OPEN INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IOREG,OOUT		; OPEN OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IOREG,WRKBLK+.IBHST
	MOVEM	IOREG,LHOST
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<



>
; (((↑↑↑)))
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IOREG,"Z"-100
	IDPB	IOREG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+1
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPN	FLAGDD
	 JRST	QUIT01
	HRRZ	REG1,DCIBUF
	CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	MOVE	IOREG,COUT		; CLOSE OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
QUIT04:	MOVE	IOREG,CINP		; CLOSE INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	RESET
	EXIT

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,104
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCIBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
NETOI2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,105
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCOBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
NETOO2:	TTCALL	3,[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	RELEAS	DDCHAN,
	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	TTCALL	3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
	ENDR

; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;   OUT: UTIL
;
NETNI:	BEGINR
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104
	ENDR

; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;   OUT: UTIL
;
NETNO:	BEGINR
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105
	ENDR

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPN	FLAGDD
	 RETURN
	HRRZ	REG1,DCIBUF
	CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IOREG,BPREG>
	MOVEI	BPREG,(REG1)
	HRLI	BPREG,440700
NUTMOL:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	SKIPE	DCOBUF+2
	 JRST	NUTMOB
	SKIPN	FLAGDD
	 JRST	NUTMOO
	HRRZ	REG1,DCOBUF
	CALLR	NUTDD
NUTMOO:	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
NUTMOB:	SOS	DCOBUF+2
	IDPB	IOREG,DCOBUF+1
	JRST	NUTMOL
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;   IN: REG1 -- POINTER TO BUFFER HEADER
;
NUTDD:	BEGINR	<IOREG,UTIL>
	HLRZ	UTIL,(REG1)
	ADDI	REG1,2
	HRLI	REG1,440700
	TRZ	UTIL,400000
	SUBI	UTIL,1
	IMULI	UTIL,5
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IOREG,REG1
	JUMPE	IOREG,RETN(0)
	TTCALL	1,IOREG
	JRST	NUTDDL
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
ICPERD:	TTCALL	3,[ASCIZ / ?? Restart failure ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ / ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ / ?? Output socket listen failure ??/]
	JRST	QUIT04
ICPET:	TTCALL	3,[ASCIZ / ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	TTCALL	3,[ASCIZ / ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ / (timeout)/]
	TTCALL	3,[ASCIZ /.
/]
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	TTCALL	3,[ASCIZ / ?? Input failure (connection) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ / ?? Output failure (connection) ??/]
	JRST	QUIT04
NETECF:	TTCALL	3,[ASCIZ / ?? File control failure ??/]
	JRST	QUIT03
NETEIT:	TTCALL	3,[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT

OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
	LOOKUP	LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	TTCALL	3,[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	TTCALL	3,[ASCIZ / (Local file not found.)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IOREG,<IOREG+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IOREG,<LFILE+1>
	MOVE	<IOREG+1>,<LFILE+2>
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	.+3
	 JRST	.+2
	JRST	LOCOO1
	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IOREG,<LFILE+1>
	MOVEM	<IOREG+1>,<LFILE+2>
	ENTER	LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	TTCALL	3,[ASCIZ / ?? Local file creation failure ??
/]
	RELEAS	LFCHAN,
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: UTIL -- SIZE IN WORDS
;
LOCS:	BEGINR
	SKIPL	LFILE+3
	 JRST	LOCS1
	HLRO	UTIL,LFILE+3	; SIZE IN WORDS
	MOVN	UTIL,UTIL
	RETURN
LOCS1:	HLRZ	UTIL,LFILE+3	; SIZE IN BLOCKS
	IMULI	UTIL,SIZBLK
	ENDR

; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR	<BPREG,UTIL>
	MOVE	BPREG,[440700,,GBUF1]
	ILDB	UTIL,BPREG
	JUMPE	UTIL,RETN(0)
	CAIN	UTIL," "
	 MOVEI	UTIL,"0"
	MOVEI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	ILDB	UTIL,BPREG
	CAIE	UTIL,"-"
	 RETURN
	MOVE	REG2,[440700,,REG3]
	SETZ	REG3,
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	MOVEI	REG2,↑D11
	CAMN	REG3,LOCDM(REG2)
	 JRST	.+3
	SOJGE	REG2,.-2
	RETURN
	ILDB	UTIL,BPREG
	CAIE	UTIL,"-"
	 RETURN
	ILDB	UTIL,BPREG
	MOVEI	REG3,-"0"(UTIL)
	IMULI	REG3,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG3,-"0"(UTIL)
	SUBI	REG3,↑D64
	IMULI	REG3,↑D12
	ADDI	REG3,(REG2)
	IMULI	REG3,↑D31
	ADDI	REG3,-1(REG1)
	ILDB	UTIL,BPREG
	CAIE	UTIL," "
	 RETURN
	ILDB	UTIL,BPREG
	MOVEI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	IMULI	REG1,6
	ILDB	UTIL,BPREG
	CAIE	UTIL,":"
	 RETURN
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	DPB	REG3,[001400,,LFILE+2]
	LSH	REG3,-14
	DPB	REG3,[170300,,LFILE+1]
	DPB	REG1,[141300,,LFILE+2]
	ENDR

; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	MOVE	REG1,[440700,,GBUF1]
	LDB	REG2,[001400,,LFILE+2] ; CREATION DATE
	LDB	REG3,[170300,,LFILE+1]
	LSH	REG3,14
	IORI	REG2,(REG3)
	IDIVI	REG2,↑D31
	MOVEI	REG4,(REG2)
	MOVEI	REG2,1(REG3)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	CAIN	REG2,"0"
	 MOVEI	REG2," "
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2,"-"
	IDPB	REG2,REG1
	MOVEI	REG2,(REG4)
	IDIVI	REG2,↑D12
	MOVEI	REG4,(REG2)
	HRRI	REG2,LOCDM(REG3)
	HRLI	REG2,440700
	SCOPY	(REG2,REG1)
	MOVEI	REG2,"-"
	IDPB	REG2,REG1
	MOVEI	REG2,↑D64(REG4)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2," "
	IDPB	REG2,REG1
	LDB	REG2,[141300,,LFILE+2] ; CREATION TIME
	IDIVI	REG2,↑D60
	MOVEI	REG4,(REG3)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2,":"
	IDPB	REG2,REG1
	MOVEI	REG2,(REG4)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	SETZ	REG2,
	IDPB	REG2,REG1
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM:	ASCII	/JAN/
	ASCII	/FEB/
	ASCII	/MAR/
	ASCII	/APR/
	ASCII	/MAY/
	ASCII	/JUN/
	ASCII	/JUL/
	ASCII	/AUG/
	ASCII	/SEP/
	ASCII	/OCT/
	ASCII	/NOV/
	ASCII	/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IOREG,BPREG,UTIL>
	HRRI	BPREG,(IOREG)
	HRLI	BPREG,440700
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
	SETZM	LFILE+3
	MOVEI	REG1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	REG2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	CAIN	IOREG,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IOREG,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IOREG,77	;   AND REMOVAL OF HIGH BITS
	XCT	(REG1)		; EXECUTE THE PROPER ROTATE
	IORM	IOREG,(REG2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	REG1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	REG2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	REG1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	REG2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IOREG,-6	; HIGH ORDER
	ROT	IOREG,-14
	ROT	IOREG,22
	ROT	IOREG,14
	ROT	IOREG,6
	ROT	IOREG,0		; LOW ORDER
	ENDR

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
	MOVE	REG1,LUTDSP
	SKIPN	(REG1)
	 JRST	LUTDSI
LUTDS1:	MOVNI	REG2,2
	ADDM	REG2,LDIBUF+2
	SKIPGE	LDIBUF+2
	 JRST	LUTDSI
	MOVE	REG3,[440700,,ABUF]
	HRLI	REG1,440600
	MOVEI	REG2,6
LUTDS2:	ILDB	REG4,REG1
	JUMPE	REG4,LUTDS3
	ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,LUTDS2
LUTDS3:	ADDI	REG1,1
	LDB	REG4,[222200,,(REG1)]
	JUMPE	REG4,LUTDS5
	MOVEI	REG4,"."
	IDPB	REG4,REG3
	HRLI	REG1,440600
	MOVEI	REG2,3
LUTDS4:	ILDB	REG4,REG1
	JUMPE	REG4,LUTDS5
	ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,LUTDS4
LUTDS5:	SETZ	REG4,
	IDPB	REG4,REG3
	ADDI	REG1,1
	HRRZM	REG1,LUTDSP
	RETURN	SKIP,1
LUTDSS:	RELEAS	LDCHAN,
	GETPPN	REG1,
	MOVEM	REG1,LDIR
	MOVE	REG1,[SIXBIT/UFD/]
	MOVEM	REG1,LDIR+1
	SETZM	LDIR+2
	MOVE	REG1,[1,,1]
	MOVEM	REG1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	IN	LDCHAN,
	 JRST	.+2
	JRST	LUTDSE
	HRRZ	REG1,LDIBUF
	ADDI	REG1,2
	SKIPE	(REG1)
	 JRST	LUTDS1
	TTCALL	3,[ASCIZ / (No local files.)
/]
	RELEAS	LDCHAN,
	RETURN
LUTDSI:	IN	LDCHAN,
	 JRST	.+2
	JRST	LUTDSD
	HRRZ	REG1,LDIBUF
	ADDI	REG1,2
	SKIPE	(REG1)
	 JRST	LUTDS1
	RELEAS	LDCHAN,
	RETURN
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 TTCALL	3,[ASCIZ / ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR

; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN:	BEGINR	<UTIL>
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	SETZM	MOVSUM
	CALLR	LOCS
	MOVEM	UTIL,MOVSPA
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,MOVTIM
MOVLN1:	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVLN2
	HRR	REG1,LFIBUF
	HRLI	REG1,2(REG1)
	HRR	REG2,DDOBUF
	HRRI	REG1,2(REG2)
	BLT	REG1,<2+200-1>(REG2)
	MOVE	REG1,LFIBUF+2
	ADDM	REG1,DDOBUF+1
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	HRRZ	REG2,LFIBUF
	ADDI	REG1,1(REG2)
	ADDI	REG2,2
	SETZ	REG3,
	ADD	REG3,(REG2)
	CAIGE	REG2,(REG1)
	 AOJA	REG2,.-2
	ADDM	REG3,MOVSUM
	JRST	MOVLN1
MOVLN2:	STATO	LFCHAN,20000
	 THUD
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,MOVTIM
	CAMGE	REG1,REG2
	 ADDI	REG1,<↑D24*↑D60*↑D60>
	SUB	REG1,REG2
	MOVEM	REG1,MOVTIM
	ENDR

; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL:	BEGINR
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	SETZM	LFOBUF+2	; COUNT: # WORDS USED (REVERSE TOPS-10)
	SETZM	MOVSUM
	SETZM	MOVSPA
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,MOVTIM
MOVNL1:	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVNL4
	MOVE	REG1,DDIBUF+2
	ADD	REG1,LFOBUF+2
	CAIL	REG1,200
	 JRST	MOVNL2
	HRR	REG2,DDIBUF
	HRLI	REG2,2(REG2)
	HRR	REG2,LFOBUF+1
	AOJ	REG2,
	HRRZ	REG1,LFOBUF+1
	ADD	REG1,DDIBUF+2
	BLT	REG2,(REG1)
	MOVE	REG1,DDIBUF+2
	ADDM	REG1,LFOBUF+1
	ADDM	REG1,LFOBUF+2
	JRST	MOVNL3
MOVNL2:	HRRZI	REG3,-200(REG1)
	MOVEI	REG4,200
	SUB	REG4,LFOBUF+2
	HRR	REG2,DDIBUF
	HRLI	REG2,2(REG2)
	HRR	REG2,LFOBUF+1
	AOJ	REG2,
	MOVE	REG1,LFOBUF
	ADDI	REG1,<2+200-1>
	BLT	REG2,(REG1)
	HRRM	REG1,LFOBUF+1
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	SETZM	LFOBUF+2
	JUMPE	REG3,MOVNL3
	MOVEM	REG3,LFOBUF+2
	ADDM	REG3,LFOBUF+1
	HRRZI	REG2,(REG4)
	ADD	REG2,DDIBUF
	HRLI	REG2,2(REG2)
	HRR	REG2,LFOBUF
	ADDI	REG2,2
	BLT	REG2,@LFOBUF+1
MOVNL3:	MOVE	REG1,DDIBUF+2
	ADDM	REG1,MOVSPA
	HRRZ	REG2,DDIBUF
	ADDI	REG1,1(REG2)
	ADDI	REG2,2
	SETZ	REG3,
	ADD	REG3,(REG2)
	CAIGE	REG2,(REG1)
	 AOJA	REG2,.-2
	ADDM	REG3,MOVSUM
	JRST	MOVNL1
MOVNL4:	STATO	DDCHAN,20000
	 THUD
	SKIPN	LFOBUF+2
	 JRST	MOVNL5
	OUT	LFCHAN,
	 JRST	MOVNL5
	THUD
MOVNL5:	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,MOVTIM
	CAMGE	REG1,REG2
	 ADDI	REG1,<↑D24*↑D60*↑D60>
	SUB	REG1,REG2
	MOVEM	REG1,MOVTIM
	ENDR

; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	UTIL,
	SETZ	FLAG,
	SETZM	MOVSUM
	IN	DDCHAN,
	 JRST	.+2
	THUD
	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVV4
MOVV1:	CAIN	FLAG,0
	 ADDI	UTIL,1
	SKIPLE	LFIBUF+2
	 JRST	.+4
	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVV2
	SOS	LFIBUF+2
	AOS	LFIBUF+1
	MOVE	IOREG,@<LFIBUF+1>
	SKIPLE	DDIBUF+2
	 JRST	.+4
	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVV5
	SOS	DDIBUF+2
	AOS	DDIBUF+1
	MOVE	REG1,@<DDIBUF+1>
	ADDM	REG1,MOVSUM
	CAMN	IOREG,REG1
	 JRST	MOVV1
	AOJA	FLAG,MOVV1
MOVV2:	STATO	LFCHAN,20000
	 THUD
	SKIPLE	DDIBUF+2
	 JRST	MOVV4
	IN	DDCHAN,
	 JRST	MOVV4
	STATO	DDCHAN,20000
	 THUD
	JUMPN	FLAG,MOVV3
	TTCALL	3,[ASCIZ / [OK]
/]
	RETURN
MOVV3:	CAIE	FLAG,1
	 JRST	.+3
	TTCALL	3,[ASCIZ / (There is one different word at /]
	JRST	MOVV03
	TTCALL	3,[ASCIZ / (There are /]
	TNOUT	<FLAG>
	TTCALL	3,[ASCIZ / different words, with the first difference at /]
MOVV03:	TNOUT	<UTIL>
	TTCALL	3,[ASCIZ /.)
/]
	RETURN
MOVV4:	SKIPLE	DDIBUF+2
	 JRST	.+4
	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVV04
	SOS	DDIBUF+2
	AOS	DDIBUF+1
	MOVE	REG1,@<DDIBUF+1>
	ADDM	REG1,MOVSUM
	JRST	MOVV4
MOVV04:	STATO	DDCHAN,20000
	 THUD
	TTCALL	3,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
	RETURN
MOVV5:	STATO	DDCHAN,20000
	 THUD
	TTCALL	3,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
	ENDR
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	REG1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	REG1,-1
	RFMOD
	TRZ	REG2,006000	; (1B24+1B25)
	SFMOD
	MOVE	REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
	MOVE	REG3,[252525,,253000] ;   AND EOL'S (NO NULLS)
	SFCOC
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	REG1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
	AIC			; ACTIVATE CHANNELS
	CALLR	ICP
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:20./]
	SETZ	REG3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	REG2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	REG1,1	; SHORT GTJFN
	HRROI	REG2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	REG2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	REG2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:22./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	REG1,DCOJFN
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	REG1,DCIJFN
	MOVE	REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	REG1,DCOJFN
	MOVE	REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	REG1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	REG1,LHOST
	ENDR

; NETWORK QUIT
;
QUIT:	MOVE	REG1,DCOJFN
	MOVEI	REG2,"Z"-100
	BOUT
	MOVEI	REG2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IOREG>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:24./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,3
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:25./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,2
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	REG1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ / ?? Network connection CLOSE failure ??
/]
	PSOUT
	ENDR

; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;   OUT: UTIL
;
NETNI:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;   OUT: UTIL
;
NETNO:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	REG1,[ASCIZ / The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	REG1,[ASCIZ / The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	REG1,[ASCIZ / ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	REG1,[ASCIZ / ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	REG1,[ASCIZ / ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	REG1,[ASCIZ / ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	REG1,[ASCIZ / ?? ICP input OPENF failure ??/]
	JRST	NETEQ

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	REG1,100001	; OLD FILE, SHORT CALL
	MOVE	REG2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOI1
	HRRZM	REG1,LJFN
	MOVE	REG2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	REG1,[ASCIZ / (Local file not found.)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	REG1,[ASCIZ / (Local file not available.)
/]
	PSOUT
	MOVE	REG1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	REG1,600001	; VN, WRITE, SHORT
	MOVE	REG2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOO2
	HRRZM	REG1,LJFN
	MOVE	REG2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	MOVE	REG1,LJFN
	RLJFN
	 JRST	.+1
LOCOO2:	HRROI	REG1,[ASCIZ / ?? Local file creation failure ??
/]
	PSOUT
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	MOVE	REG1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	REG1,[ASCIZ / ?? Local file CLOSE failure ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: UTIL -- SIZE IN WORDS
;
LOCS:	BEGINR
	MOVE	REG1,LJFN
	MOVE	REG2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	REG3,UBUF1
	GTFDB
	 JRST	.+3
	SETZ	UTIL,
	RETURN
	LDB	REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	REG2,↑D36
	IDIVI	REG2,(REG1)	; BYTES/WD
	MOVE	REG3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	REG3,-1(REG2)	; ACCOUNT FOR TRUNCATION
	IDIVI	REG3,(REG2)	; NUMBER OF WORDS
	MOVE	UTIL,REG3
	ENDR

; LOCDG -- LOCAL FILE WRITE DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR	<IOREG,UTIL>
	HRROI	REG1,GBUF1
	SETZ	REG2,
	IDTIM
	 RETURN
	MOVE	IOREG,REG2
	MOVEI	REG1,400000	; FOR THIS FORK
	RPCAP
	TRNN	REG2,600000	; (1B18+1B19) WHEEL OR OPER
	 RETURN
	MOVE	UTIL,REG3
	TRO	REG3,(REG2)
	EPCAP			; ENABLE (!)
	HRR	REG1,LJFN
	HRLI	REG1,14		; OFFSET 14 (LAST WRITE)
	SETO	REG2,
	MOVE	REG3,IOREG
	CHFDB
	 JRST	.+1
	MOVEI	REG1,400000
	MOVE	REG3,UTIL
	EPCAP			; RESET CAPABILITIES
	ENDR

; LOCDP -- LOCAL FILE WRITE DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	MOVE	REG1,LJFN
	MOVE	REG2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	REG3,GBUF1
	GTFDB
	 JRST	.+3
	SETZM	GBUF1
	RETURN
	HRROI	REG1,GBUF1
	MOVE	REG2,GBUF1
	SETZ	REG3,
	ODTIM
	ENDR

; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN:	BEGINR	<IOREG,UTIL>
	SETZM	MOVSUM
	CALLR	LOCS
	MOVEM	UTIL,MOVSPA
	MOVN	IOREG,UTIL
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,MOVTIM
MOVLN1:	MOVE	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SIN
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SOUT
	MOVN	UTIL,IOREG
	CAILE	UTIL,SIZPAG
	 MOVEI	UTIL,SIZPAG
	SETZ	REG1,
	ADD	REG1,<PAGE-1>(UTIL)
	SOJG	UTIL,.-1
	ADDM	REG1,MOVSUM
	ADDI	IOREG,SIZPAG
	JUMPL	IOREG,MOVLN1
	MOVE	REG1,DCDJFN
	MOVEI	REG2,21
	MTOPR
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,MOVTIM
	SUB	REG3,REG2
	MOVEM	REG3,MOVTIM
	ENDR

; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL:	BEGINR	<UTIL>
	SETOM	FLAGEF
	SETZM	MOVSUM
	SETZM	MOVSPA
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,MOVTIM
MOVNL1:	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	SIN
	MOVE	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	ADDI	REG3,SIZPAG	; WORDS RECEIVED
	JUMPE	REG3,MOVNL2
	MOVEI	UTIL,(REG3)
	MOVNI	REG3,(REG3)
	SOUT
	ADDM	UTIL,MOVSPA
	SETZ	REG1,
	ADD	REG1,<PAGE-1>(UTIL)
	SOJG	UTIL,.-1
	ADDM	REG1,MOVSUM
MOVNL2:	SKIPE	FLAGEF
	 JRST	MOVNL1
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,MOVTIM
	SUB	REG3,REG2
	MOVEM	REG3,MOVTIM
	ENDR

; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	UTIL,
	SETZ	FLAG,
	SETOM	FLAGEF
	SETZM	MOVSUM
MOVV1:	CAIN	FLAG,0
	 ADDI	UTIL,1
	MOVE	REG1,LJFN
	BIN
	SKIPN	FLAGEF
	 JRST	MOVV2
	MOVE	IOREG,REG2
	MOVE	REG1,DCDJFN
	BIN
	SKIPN	FLAGEF
	 JRST	MOVV5
	ADDM	REG2,MOVSUM
	CAMN	IOREG,REG2
	 JRST	MOVV1
	AOJA	FLAG,MOVV1
MOVV2:	SETOM	FLAGEF
	MOVE	REG1,DCDJFN
	BIN
	SKIPE	FLAGEF
	 JRST	MOVV4
	JUMPN	FLAG,MOVV3
	HRROI	REG1,[ASCIZ / [OK]
/]
	PSOUT
	RETURN
MOVV3:	CAIE	FLAG,1
	 JRST	.+4
	HRROI	REG1,[ASCIZ / (There is one different word at /]
	PSOUT
	JRST	MOVV03
	HRROI	REG1,[ASCIZ / (There are /]
	PSOUT
	TNOUT	<FLAG>
	HRROI	REG1,[ASCIZ / different words, with the first difference at /]
	PSOUT
MOVV03:	TNOUT	<UTIL>
	HRROI	REG1,[ASCIZ /.)
/]
	PSOUT
	RETURN
MOVV4:	ADDM	REG2,MOVSUM
	BIN
	SKIPE	FLAGEF
	 JRST	MOVV4
	HRROI	REG1,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
	PSOUT
	RETURN
MOVV5:	HRROI	REG1,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
	PSOUT
	ENDR

; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	HRROI	REG1,[ASCIZ / ?? Unexpected EOF at /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ / ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSI:	HRRZ	REG1,PSIPC1
	MOVE	REG2,-1(REG1)
	CAMN	REG2,[GTFDB]
	 JRST	ILIPSD
	CAMN	REG2,[CHFDB]
	 JRST	ILIPSD
	HRROI	REG1,[ASCIZ / ?? Illegal instruction at /]
	CAMN	REG2,[-1]
	 HRROI	REG1,[ASCIZ / ?? Impossible event at /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ / ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSD:	HRROI	REG1,[ASCIZ / (Bad local device.)
/]
	PSOUT
	AOS	PSIPC1
	DEBRK		; RETURN FROM INTERRUPT
>
; (((↑↑↑)))

; ***DATA***

CRLF:	BYTE	(7)15,12,0,0,0
SEMI:	BYTE	(7)73,15,12,0,0

HOSTS:	11,,[ASCIZ /HARVARD/]
	13,,[ASCIZ /ITS/]		; SAIL
	37,,[ASCIZ /CCA/]
	53,,[ASCIZ /OFFICE"-1/]
	55,,[ASCIZ /SCI/]
	56,,[ASCIZ /RUTGERS/]
	61,,[ASCIZ /BBN/]		; TENEXB
	70,,[ASCIZ /SUMEX/]
	102,,[ASCIZ /AIC/]
	106,,[ASCIZ /ITS/]		; DMS
	126,,[ASCIZ /ISI/]		; ISI
	162,,[ASCIZ /BBN/]		; TENEXD
	206,,[ASCIZ /ITS/]		; AI
	226,,[ASCIZ /ISI/]		; ISIC
	305,,[ASCIZ /BBN/]		; TENEXA
	306,,[ASCIZ /ITS/]		; ML
	326,,[ASCIZ /ISI/]		; ISID
	354,,[ASCIZ /ITS/]		; MC
	361,,[ASCIZ /BBN/]		; TENEXC
	364,,[ASCIZ /ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE

; (((ITS)))
IFL F.TENX,<
IOBUFR:	BLOCK 2000
LCLDEV:	BLOCK 1			; local device
LCLFN1:	BLOCK 1
LCLFN2:	BLOCK 1
LCLSNM:	BLOCK 1			; SNAME
RCHBLK:	BLOCK 10		; network status goes here
LCLRCV:	BLOCK 1
LCLTRN:	BLOCK 1
FORRCV:	BLOCK 1
FORTRN:	BLOCK 1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

IFE F.SAIL,<
ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
>
; (((↑↑↑)))
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

LFILE:	0			; LOCAL FILE NAME
	0			; EXTENSION
	0			; PROTECTION AND CREATION DATE
	0			; PROJ-PROG - 0 IS SELF
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	REPEAT 4,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBUFS
LJFN:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

; * VARIABLES

LHOST:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBUFS-1>

CMDMOD:	0

FLAGDD:	0
FLAGDE:	0
FLAGTT:	-1

MOVSUM:	0
MOVSPA:	0
MOVTIM:	0

; * BLOCKS

CONTEX:	BLOCK	LBUFS

ABUF:	BLOCK	SBUFS
UBUF1:	BLOCK	LBUFS
UBUF2:	BLOCK	SBUFS

PBUF:	BLOCK	LBUFS
GBUF1:	BLOCK	LBUFS
GBUF2:	BLOCK	LBUFS

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ
	-1			; cretinous LINK-10 bug


	END	DFTP
βββ